Django Rest Framework Serializer Relations: Как получить список всех дочерних объектов в родительском сериализаторе?

Я новичок в DRF и только начал создавать API. У меня есть две модели, дочерняя модель, связанная с родительской моделью с внешним ключом. Вот упрощенная версия модели, которую я имею:

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


class Child(models.Model):
    parent = models.ForeignKey(Parent)
    child_name = models.CharField(max_length=80)

Чтобы создать сериализаторы, я следовал Связям с DRF Serializer и создал их как следующее:

class ChildSerializer(serializers.HyperlinkedModelSerializer):

    parent_id = serializers.PrimaryKeyRelatedField(queryset=Parent.objects.all(),source='parent.id')

    class Meta:
        model = Child
        fields = ('url','id','child_name','parent_id')

    def create(self, validated_data):
        subject = Child.objects.create(parent=validated_data['parent']['id'], child_name=validated_data['child_name'])

        return child


class ParentSerializer(serializers.HyperlinkedModelSerializer):
    children = ChildSerializer(many=True, read_only=True)
    class Meta:
        model = Course
        fields = ('url','id','name','children')

Я пытаюсь получить список всех детей в родительском сериализаторе. Я хочу получить ответ, подобный следующему:

{
    'url': 'https://dummyapidomain.com/parents/1/',  
    'id': '1',
    'name': 'Dummy Parent Name',
    'cildren': [
        {'id': 1, 'child_name': 'Dummy Children I'},
        {'id': 2, 'child_name': 'Dummy Children II'},
        {'id': 3, 'child_name': 'Dummy Children III'},
        ...
    ],
}

Я не ожидал, что это сработает, поскольку в модели Parent нет связи между родителем и ребенком, но это рекомендуемый способ сделать это в документации , и он не сработал.

Я получаю следующее сообщение об ошибке:

Got AttributeError when attempting to get a value for field `children` on serializer `ParentSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `Parent` instance.
Original exception text was: 'Parent' object has no attribute 'children'.

Я думаю, что это совершенно разумно, но я не мог понять, чего мне здесь не хватает.

Как я могу получить список всех дочерних элементов в сериализаторе родителя?

12 голосов | спросил hnroot 22 72015vEurope/Moscow11bEurope/MoscowSun, 22 Nov 2015 12:15:03 +0300 2015, 12:15:03

2 ответа


0

Думаю, ваша проблема в том, что вы забыли добавить related_name для своей модели Children. Я хотел бы иметь такие модели:

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

class Child(models.Model):
    parent = models.ForeignKey(Parent, related_name='children')  # <--- Add related_name
    child_name = models.CharField(max_length=80)

И я думаю, что с этим изменением вы исправите ошибку, которую получили

ответил AlvaroAV 22 72015vEurope/Moscow11bEurope/MoscowSun, 22 Nov 2015 12:25:03 +0300 2015, 12:25:03
0

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

  1. С SerializerMethodField: ваш код стал таким:

    class ParentSerializer(serializers.ModelSerializer):
    
         children_list = serializers.SerializerMethodField('_get_children')
    
         def _get_children(self, obj):
             serializer = ChildSerializer(obj.child_list(), many=True)
             return serializer.data
    
        class Meta:
            model = Course
            fields = ('url','id','name','children_list')
    
  2. Каждое поле может быть атрибутом модели или метода, поэтому вы можете определить метод get_children_list в модели Parent и затем вызвать его в список полей ParentSerializer:

    class ParentSerializer(serializers.ModelSerializer):
    
        class Meta:
             model = Course
             fields = ('url','id','name','get_children_list')
    

Примечание. В этом сценарии вам необходимо наследовать от serializers.ModelSerializer

ответил Moe Far 22 72015vEurope/Moscow11bEurope/MoscowSun, 22 Nov 2015 12:30:59 +0300 2015, 12:30:59

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132