Django Rest Framework необязательные вложенные отношения - PullRequest
2 голосов
/ 07 марта 2019

возможно ли использовать в качестве опции вложенный сериализатор отношений? Это пример сериализатора из документов:

class TrackSerializer(serializers.ModelSerializer):
    class Meta:
        model = Track
        fields = '__all__'

class AlbumSerializer(serializers.ModelSerializer):
    tracks = TrackSerializer(many=True, read_only=True)

    class Meta:
        model = Album
        fields = '__all__'

когда я вызываю список альбомов localhost:8000/album/1/, это ответ:

{
    'album_name': 'The Grey Album',
    'artist': 'Danger Mouse',
    'tracks': [
        {'order': 1, 'title': 'Public Service Announcement', 'duration': 245},
        {'order': 2, 'title': 'What More Can I Say', 'duration': 264},
        {'order': 3, 'title': 'Encore', 'duration': 159},
        ...
    ],
}

есть ли опция, подобная этой localhost:8000/album/1/?include=tracks, поэтому данные треков появляются только тогда, когда они указаны в параметре include.

Ответы [ 2 ]

1 голос
/ 07 марта 2019

Пример

class OrderSerializer(ModelSerializer):
    payments = PaymentSerializer(many=True, read_only=True)
    evaluations = OrderEvaluationSerializer(many=True, read_only=True)

    def __init__(self, *args, **kwargs):
        super(OrderSerializer, self).__init__(*args, **kwargs)

        request = kwargs['context']['request']
        include_address = request.GET.get('include_address', False)  # <<<---

        if include_address:  # <<<---
            self.fields['user_location'] = UserLocationSerializer(read_only=True, context=kwargs['context'])  # <<<---

отсюда: http://masnun.com/2015/10/21/django-rest-framework-dynamic-fields-in-serializers.html

0 голосов
/ 07 марта 2019

Вы можете использовать пакет drf-dynamic-fields .Он используется для динамического включения полей путем передачи параметров URL, как показано ниже:

GET /identities

[
  {
    "id": 1,
    "url": "http://localhost:8000/api/identities/1/",
    "type": 5,
    "data": "John Doe"
  },
  ...
]

Запрос с параметром fields с другой стороны возвращает только подмножество полей:

GET /identities/?fields=id,data

[
  {
    "id": 1,
    "data": "John Doe"
  },
  ...
]

И запрос с параметром omit исключает указанные поля.

GET /identities/?omit=data

[
  {
    "id": 1,
    "url": "http://localhost:8000/api/identities/1/",
    "type": 5
  },
  ...
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...