Django Rest API для моделей с «необязательным» внешним ключом - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть модель:

models.py

class Doctor(models.Model):
    doctor_name = models.CharField(max_length=264, unique=True)      # on_delete argument needs to be researched more deeply.
    address = models.ForeignKey(Address, on_delete=models.CASCADE, null=True, blank=True)
    contact_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$', message="Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.")
    contact = models.CharField(validators=[contact_regex], max_length=15, null=True, blank=True) # validators should be a list
    qualifications = models.CharField(max_length=264, null=True, blank=True)
    license = models.CharField(max_length=264, null=True, blank=True)
    note = models.TextField(null=True, blank=True)

    def __str__(self):
        return self.doctor_name

В этой модели поле внешнего адреса "адрес" является необязательным. Я хочу создать API отдыха. Но если я не предоставлю адресные поля, это выдаст ошибку. Это работает нормально, если я предоставлю адресные поля.

Doctor API

serializers.py

class AddressSerializer(serializers.ModelSerializer):
    class Meta:
        model = Address
        fields = '__all__'


class DoctorSerializer(serializers.ModelSerializer):
    address = AddressSerializer()

    class Meta:
        model = Doctor
        fields = ['doctor_name', 'contact', 'qualifications', 'license', 'note', 'address']

    def create(self, validated_data):
        address_data = validated_data.pop('address')
        addr = Address.objects.create(**address_data)
        print(addr)
        doctor = Doctor.objects.create(**validated_data, address=addr)
        return doctor

API error without address

1 Ответ

0 голосов
/ 05 апреля 2020

Если адрес не указан, вы не должны сохранять экземпляр Address:

class DoctorSerializer(serializers.ModelSerializer):
    address = AddressSerializer(allow_null=True)  # Allow null value

    class Meta:
        model = Doctor
        fields = ['doctor_name', 'contact', 'qualifications', 'license', 'note', 'address']

    def create(self, validated_data):
        address_data = validated_data.pop('address')
        # Check if address is given
        if address_data:
            addr = Address.objects.create(**address_data)
        print(addr)
        doctor = Doctor.objects.create(**validated_data, address=addr)
        return doctor
...