Как работать с вложенными объектами в Django REST Framework - PullRequest
0 голосов
/ 13 октября 2018

Я новичок в Django REST Framework.В моих моделях Django у меня есть модели Store и SimilarStore.Хранилище имеет similarstore_set, в котором есть несколько похожих хранилищ, а в каждом подобном хранилище в качестве внешнего ключа есть столбец store, показывающий id.Однако я хочу показать столбцы объекта магазина вместо id.

. Как вы видите на следующем примере API, магазин с id 7 имеет 3 аналогичных магазина, а аналогичный магазин имеет store внешний ключ, показывает номер идентификатора соответствующего магазина.Я хочу показать его дочерние столбцы вместо просто id число.

[
    {
        "id": 7,
        "status": "active",
        "businessName": "Ruby Claire Boutique",
            "similarstore_set": [
                {
                    "id": 1182,
                    "store": 7,     <--- wanna show the store's child columns
                },
                {
                    "id": 1208,
                    "store": 7,     <--- wanna show the store's child columns
                },
                {
                    "id": 1249,
                    "store": 7,     <--- wanna show the store's child columns
                }
            ]

    },
    ...
]

Я пытаюсь это сделать, потому что когда я показываю страницу с подробным описанием магазина с id 7, мне нужно показатьинформация о похожем магазине на странице с подробностями магазина.Тем не менее, я не могу показать достаточно информации, просто набрав id.

Я не уверен, что я иду в правильном направлении.Кто-нибудь может мне помочь по этому поводу?

РЕДАКТИРОВАТЬ

serializers.py

class SimilarStoreSerializer(ModelSerializer):

    store = StringRelatedField()

    class Meta:
        model = SimilarStore
        fields = ('id', 'store', )


class StoreSerializer(ModelSerializer):

    similarstore_set = SimilarStoreSerializer(many=True)

    class Meta:
        model = Store
        fields = ('id', 'status', 'businessName', 'similarstore_set', )

models.py

class Store(models.Model):

    status = CharField(...)
    businessName = CharField(...)
    ...


class SimilarStore(models.Model):

    store = ForeignKey(Store)
    ...

1 Ответ

0 голосов
/ 13 октября 2018

Поскольку ваш вопрос неполный , я предполагаю, что similarstore_set - это данные обратной связи , и они отображаются с помощью вложенный сериализатор класса .

Здесь вы можете попробовать два решения:

1. Определите другой сериализатор для Storeмодель и ссылку на него в конкретном сериализаторе. См. Этот официальный документ для получения дополнительной информации

2. Используйте атрибут depth в Similarstore мета-классе сериализатора. См. Документ


Пример
Использование depth,

class SimilarStoreSerializer(serializers.ModelSerializer):
    class Meta:
        model = SimilarStore
        fields = '__all__'
        depth = 1


class TopLevelSerializer(serializers.ModelSerializer):
    similarstore_set = SimilarStoreSerializer(many=True)

    class Meta:
        model = someModel
        fields = '__all__'

ОБНОВЛЕНИЕ-1

Добавить depth поле в мета-классе SimilarStoreSerializer как

class SimilarStoreSerializer(ModelSerializer):
 <b>   # removed "store = StringRelatedField()"</b>
    class Meta:
        model = SimilarStore
        fields = ('id', 'store', )
        <b>depth = 1</b>

UPDATE-2
Создайте StoreMinimalSerializer и определите обязательные поля в соответствии с вашими потребностями

class StoreMinimalSerializer(serializers.ModelSerializer):
    class Meta:
        model = Store
        fields = (add fields you want,)


class SimilarStoreSerializer(ModelSerializer):
    <b>store = StoreMinimalSerializer()</b>

    class Meta:
        model = SimilarStore
        fields = ('id', 'store',)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...