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



我有两个相互关联的类。其中一个类的主键是一个char字段,这样我就可以很容易地引用它或创建它来匹配实际对象的id(所有对象都有这个唯一的名称)。

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

然而,当我试图运行我的测试:

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来创建即使它不存在但它没有被调用。数据在其他地方被验证。我的断点在我的视图集的perform_create也不触发。

我不想为一些应该很简单的东西写一堆变通代码。我知道我在什么地方漏了什么东西。

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

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


最新更新