Попытка связать таблицы в Django

пытаюсь выполнить POST запрос и создать новое местоположение. теперь заполненный country_id вызывает много проблем. это классы

class Country(models.Model):
id = UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
country_name = CharField(max_length=255)
federal_rate = FloatField()
social_security = FloatField()
comment = CharField(max_length=255)

class Location(models.Model):
participant_id = ForeignKey('Participant', on_delete=CASCADE, related_name="locations")
country_id = ForeignKey('Country', on_delete=CASCADE, related_name="country")
start_date = DateField()
end_date = DateField()
region = CharField(max_length=255)
tax_policy = CharField(max_length=255, null=True)

Serializer

class CountrySerializer(serializers.ModelSerializer):

class Meta:
    model = Country
    fields = "__all__"

class LoactionSerializer(serializers.ModelSerializer):
country_id = CountrySerializer(many=False)

class Meta:
    model = Location
    fields = "__all__"

теперь единственное, почему мне удается соединить таблицы, это добавление строки country_id в seirializer, и когда я пытаюсь создать новое местоположение, возникает ошибка вот как я пытаюсь добавить новое местоположение

{
"start_date": "2021-10-10",
"end_date": "2021-11-18",
"region": "markian-land",
"tax_policy": "N/A",
"participant_id": "c5c1a00c-4263-418a-9f3a-3ce40a1ea334",
"country_id": "9067e71f-c6b9-4ecc-ad6b-461843063aee"
}

Ошибка - {"country_id": {"non_field_errors": ["Неверные данные. Ожидался словарь, а получился str."]}}

когда мне удается отправить как dict, но у меня возникает другая ошибка, которая запрашивает все поля Country, поэтому я получаю конкретную страну из базы данных, и когда я отправляю ее, я получаю ошибку json

this

country_id = ForeignKey(Country, on_delete=CASCADE, related_name="country")

Вы определили country_id как CountrySerializer в LocationSerializer и в CountrySerializer, fields = "__all__" значит, вам нужно передать все поля объекта страны, чтобы это заработало.

Попробуйте удалить country_id = CountrySerializer(many=False) в LocationSerializer и повторите попытку.

Вы можете получить более подробную информацию в этом ответе

Django Rest Framework не предоставляет такой функциональности, вам нужно сначала создать поле сериализатора.

from rest_framework import serializers


class RelatedFieldAlternative(serializers.PrimaryKeyRelatedField):
    def __init__(self, **kwargs):
        self.serializer = kwargs.pop('serializer', None)
        if self.serializer is not None and not issubclass(self.serializer, serializers.Serializer):
            raise TypeError('"serializer" is not a valid serializer class')

        super().__init__(**kwargs)

    def use_pk_only_optimization(self):
        return False if self.serializer else True

    def to_representation(self, instance):
        if self.serializer:
            return self.serializer(instance, context=self.context).data
        return super().to_representation(instance)

Затем используйте это новое поле сериализатора в сериализаторе Location как,

class LoactionSerializer(serializers.ModelSerializer):
    country_id = RelatedFieldAlternative(queryset = Country.objects.all(),
                     serializer=CountrySerializer)

    class Meta:
        model = Location
        fields = "__all__"

Обратите внимание: у вас опечатка в LoactionSerializer.

Вернуться на верх