Django Вложенные сериализаторы с возможностью записи - ошибка NOT NULL Ограничения - PullRequest
0 голосов
/ 17 января 2020

Я пытаюсь создать объект «Проспект», который вложен в мой сериализатор «Назначение». Но при публикации я получаю сообщение об ошибке: « Сбой ограничения NOT NULL: schedule_appointment.prospect_id ».

Полагаю, что Django ожидает, что я передам проспект_id, но как это сделать? Я go об этом? В другом месте я читал, что альтернативой является установка внешнего ключа в значение null = True, но в моем случае назначение ДОЛЖНО иметь перспективу.

Есть предложения?

Сериализаторы

class ProspectSerializer(serializers.ModelSerializer):

    class Meta:
        model = Prospect
        fields = [  'id','first_name', 'last_name', 'email']


class AppointmentSerializer(serializers.ModelSerializer):
    prospect = ProspectSerializer()

    class Meta:
        model = Appointment
        fields = ['appointment_time', 'unit', 'staff', 'prospect']

    def create(self, validated_data):
        prospect_data = validated_data.pop('prospect')
        appointment = Appointment.objects.create(**validated_data)
        Prospect.objects.create(appointment=appointment, **prospect_data)
        return appointment

Модели

class Appointment(models.Model):
    appointment_time = models.DateTimeField()
    unit = models.ForeignKey(Unit, on_delete=models.CASCADE)
    staff = models.ForeignKey(Staff, on_delete=models.CASCADE)
    prospect = models.ForeignKey(Prospect, on_delete=models.CASCADE)

class Prospect(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    email = models.EmailField(max_length=30)

1 Ответ

2 голосов
/ 17 января 2020

Сначала вам нужно создать модель Prospect, а затем Appointment

def create(self, validated_data):
        prospect_data = validated_data.pop('prospect')
        prospect = Prospect.objects.create(**prospect_data)
        appointment = Appointment.objects.create(prospect=prospect, **validated_data)

        return appointment
...