Как добавить идентификаторы внешнего ключа дочернего экземпляра в качестве поля списка сериализатора идиоматически? - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть модель «многие ко многим», например RequestRequestItemItem, и я хочу, чтобы ответ от конечной точки API Request включал список идентификаторов Item. У меня есть рабочий метод сериализатора, как это:

def to_representation(self, instance: Request) -> typing.Dict[str, Any]:
    representation: Dict = super().to_representation(instance)
    representation["items"] = [
        item_id for item_id
        in instance.requestitems_set.values_list("item_id", flat=True)
    ]
    return representation

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

Ответы [ 3 ]

1 голос
/ 22 апреля 2019

Его можно добавить довольно просто, как и любое другое поле в сериализаторе

class RequestSerializer(serializers.ModelSerializer):
    ....
    items = serializers.SlugRelatedField(
        source='requestitems_set',
        slug_field='item_id',
        read_only=True,
        many=True,
    )

И затем, конечно, добавить его в список полей

1 голос
/ 22 апреля 2019

из предоставленной информации, вы можете уменьшить использование for loop как

def to_representation(self, instance: Request) -> typing.Dict[str, Any]:
    representation: Dict = super().to_representation(instance)
    <b>representation["items"] = list(instance.requestitems_set.values_list("item_id", flat=True))</b>
    return representation
0 голосов
/ 22 апреля 2019

Есть несколько связанных полей , реализованных DRF. Но API открыт для вас, чтобы реализовать свой собственный. Я думаю, что это более читаемое и чистое решение.

class ItemIdRelatedField(serializers.RelatedField):
    def to_internal_value(self, data):
        pass
        # implement if you need it.

    def to_representation(self, value):
        return value.item_id

И используйте это как поле в сериализаторе, как это.

items = ItemIdRelatedField(many=True, source='requestitems_set', queryset=RequestItem.objects.all())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...