DRF Недопустимый объект pk не существует для внешнего ключа при создании POST
У меня есть два класса, связанных друг с другом. В одном классе я сделал первичный ключ полем 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
моего набора представлений также не срабатывает.
Я не хочу писать кучу обходного кода для того, что должно быть простым. Я знаю, что я где-то что-то упускаю/пропускаю.
Думаю, вам нужно настроить метод create
в 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