我有两个互相关联的班级。有一个类我将主键设置为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
,以便在不存在但未被调用的情况下创建ven。数据正在其他地方被验证。在我的视图集的perform_create
中,我的断点也不会触发。
我不想为一些应该简单明了的事情编写一堆变通代码。我知道我错过了什么地方/搞砸了。
发布于 2022-06-09 03:27:34
我认为您需要自定义DeviceSerializer
中的DeviceSerializer
方法。
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
https://stackoverflow.com/questions/72553537
复制相似问题