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
            
        
Вернуться на верх