Определить Django Rest Framework ModelSerializer ForeignKey с атрибутом, отличным от pk - PullRequest
0 голосов
/ 14 ноября 2018

Мне кажется, что это супер базовый вопрос, но я не могу найти ответ в документации DRF.

Допустим, у меня models.py настроено так:

#models.py
class Person(models.Model):
    name = models.CharField(max_length=20)
    address = models.CharField(max_length=20)

class House(models.Model):
    name = models.CharField(max_length=20)
    owner = models.ForeignKey(Person)

И у меня ModelSerializer настроен так:

#serializers.py
class House(serializers.ModelSerializer):
    class Meta:
        model = House
        fields = '__all__'

То, что я хочу сделать, - это иметь возможность POST новых объектов Дома, но вместо того, чтобы указывать pk объекта Person , я хочу иметь возможность указать имя объекта Человек .

1017 * Е.Г. *

post = {'name': 'Blue House', 'owner': 'Timothy'}

Реальные модели, которые я использую, имеют несколько полей ForeignKey, поэтому я хочу знать наиболее канонический способ сделать это.

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Одним из решений может быть использование SlugRelatedField

#serializers.py
class House(serializers.ModelSerializer):
    owner = serializers.SlugRelatedField(
        slug_field="name", queryset=Person.objects.all(),
    )
    class Meta:
        model = House
        fields = '__all__'

Это также изменит представление вашего сериализатора, поэтому оно будет отображать имя человека при его рендеринге. Если вам нужно отобразить первичный ключ Person, вы можете либо переопределить метод сериализаторов House to_representation(), либо реализовать небольшое настраиваемое поле сериализатора, унаследовав SlugRelatedField и переопределив to_representation() вместо этого.

0 голосов
/ 14 ноября 2018

Измените ваш сериализатор, как показано ниже, переопределив метод create()

class House(serializers.ModelSerializer):
    owner = serializers.CharField()

    class Meta:
        model = House
        fields = '__all__'

    def create(self, validated_data):
        owner = validated_data['owner']
        person_instance = Person.objects.get(owner=owner)
        return House.objects.create(owner=person_instance, **validated_data)
...