首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >DRF无效pk对象在POST创建时不存在外键

DRF无效pk对象在POST创建时不存在外键
EN

Stack Overflow用户
提问于 2022-06-09 00:33:11
回答 1查看 250关注 0票数 0

我有两个互相关联的班级。有一个类我将主键设置为char字段,这样我就可以轻松地引用它,或者创建它来匹配实际对象的id (所有对象都有这个唯一的名称)。

代码语言:javascript
运行
复制
from django.db import models

class Ven(models.Model):
    id = models.CharField(max_length=80, primary_key=True)
    statusOn = models.BooleanField(default=True)


class Device(models.Model):
    device_id = models.CharField(max_length=80)
    ven_id = models.ForeignKey(VEN, related_name='devices', on_delete=models.SET_NULL, null=True)

class DeviceSerializer(serializers.ModelSerializer):
    
    class Meta:
        model = Device
        fields = ['id', 'device_id', 'ven_id']


class VENSerializer(serializers.ModelSerializer):
    class Meta:
        model = VEN
        fields = ['id', 'statusOn', 'devices']


class DeviceList(generics.ListCreateAPIView):
    logger.info("DeviceList: view")

    # permission_classes = [permissions.IsAuthenticated]

    queryset = Device.objects.all()
    serializer_class = DeviceSerializer

但是,当我尝试运行测试时:

代码语言:javascript
运行
复制
class DevicesTestCase(TestCase):
    def setUp(self):
        self.factory = Client()

    def test_create_device(self):
        device = {
            "ven_id": "TEST_VEN_1",
            "device_id": "TEST_DEVICE_1",
            "statusOn": True,
        }
        response = self.factory.post('/devices/', data=device)
        self.assertEqual(response.status_code, 201)

我的回复返回400并声明:

b'{"ven_id":["Invalid pk \\"TEST_VEN_1\\" - object does not exist."]}'

我正在尝试在序列化程序中编写一个自定义create,以便在不存在但未被调用的情况下创建ven。数据正在其他地方被验证。在我的视图集的perform_create中,我的断点也不会触发。

我不想为一些应该简单明了的事情编写一堆变通代码。我知道我错过了什么地方/搞砸了。

EN

回答 1

Stack Overflow用户

发布于 2022-06-09 03:27:34

我认为您需要自定义DeviceSerializer中的DeviceSerializer方法。

代码语言:javascript
运行
复制
class DeviceSerializer(serializers.ModelSerializer):
    ven_id = serializers.CharField()
    status_on = serializers.BooleanField(write_only = True)
    
    class Meta:
        model = Device
        fields = ['id', 'device_id', 'ven_id']

    def create(self, validated_data):
        ven_id = validated_data.pop('ven_id')
        status_on = validated_data.pop('status_on')
        try:
            ven = Ven.objects.get(id = ven_id)
        except Ven.DoesNotExist:
            ven = Ven.objects.create(id = ven_id, statusOn = status_on)

        new_device = Device.objects.create(ven_id = ven, **validated_data)
        return new_device
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72553537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档