Проводка данных в модель с внешним ключом в django rest framework - PullRequest
0 голосов
/ 29 марта 2020

У меня есть две модели, подобные этой:

class Address(models.Model):
    line1 = models.CharField(max_length=264)
    line2 = models.CharField(max_length=264)
    line3 = models.CharField(max_length=264)
    city = models.CharField(max_length=264)
    state_province = models.CharField(max_length=264)
    zip_pincode = models.CharField(max_length=264)
    country = models.CharField(max_length=264)
    other_details = models.TextField()

    def __str__(self):
        return self.id


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)
    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, blank=True) # validators should be a list
    qualifications = models.CharField(max_length=264)
    license = models.CharField(max_length=264)
    note = models.TextField()

    def __str__(self):
        return self.doctor_name

Я хочу создать API, в котором данные доктора включают адрес. поэтому адрес должен быть создан, и его идентификатор должен быть в модели доктора в качестве внешнего ключа в одном вызове API.

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

    class Meta:
        model = Doctor
        fields = '__all__'

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

Это дает сообщение об ошибке целостности, так как address_id принимает значение NULL.

Может кто-то помочь мне с этим?

1 Ответ

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

Это сработало для меня.

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


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

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

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