DRF: Сериализация отношений между родителями и детьми в словарь вместо списка при использовании unique_together - PullRequest
0 голосов
/ 29 ноября 2018

Я относительно новичок в использовании Django и Django Rest Framework, но вот что я пытаюсь сделать.

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

class Parent(models.Model):
    name = models.CharField()

class Child(models.Model):
    parent = models.ForeignKey(Parent)
    name = models.CharField()
    age = models.IntegerField()

    class Meta:
        unique_together = ('parent', 'name',)

Я хочу сериализоватьparent таким образом, что GET для родителя возвращает что-то в форме:

{
    name: <parent name>,
    children: {
        <child name 1>: <age>,
        <child name 2>: <age>
    }
}

В настоящее время я могу только выяснить, как вернуть список дочерних элементов с помощью сериализатора, такого как:

class ParentSerializer(serializers.ModelSerializer):

    children = ChildrenSerializer(many=True,read_only=True)

    class Meta:
        model = Parent
        fields = '__all__'

Что возвращает:

{
    name: <parent name>,
    children: [
        {
            name: <child name 1>,
            age: <child age 1>
        },
        {
            name: <child name 2>,
            age: <child age 2>
        }
    ]
}

Как я могу заставить родительский сериализатор возвращать один словарь в разделе 'children' с ключом имени ребенка вместо списка словарей?

1 Ответ

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

Вы можете использовать SerializerMethodField, чтобы получить children для родителя и создать этот словарь самостоятельно:

class ParentSerializer(serializers.ModelSerializer):

    children = serializers.SerializerMethodField()

    def get_children(self, obj):
        return {c.name: c.age for c in obj.child_set.all()}

    class Meta:
        model = Parent
        fields = '__all__'
...