Как извлечь список только родительских объектов из вложенной модели? - PullRequest
0 голосов
/ 29 марта 2019

Я создаю каталог товаров для продавца. У продавца есть несколько каталогов.Каталог может содержать несколько элементов. Эти элементы могут содержать несколько моделей.

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

С моим текущим кодом, всякий раз, когда я пытаюсь получить список продавцов, список также извлекает все отношения на самый низкий уровень.Набор запросов, который я использую, кажется, формирует правильный запрос.

Я пытался использовать параметры .values, .values_list, .only.Но это дает мне ошибку Got AttributeError при попытке получить значение для поля catalogue на сериализаторе SellerDataSerializer.Поле сериализатора может иметь неправильное имя и не соответствовать ни одному атрибуту или ключу в экземпляре tuple.Исходный текст исключения был: объект 'tuple' не имеет атрибута 'catalog'.

Моя модель:

class SellerData(models.Model):
    seller_name = models.CharField(max_length=30)
    seller_id = models.CharField(max_length=50)

    def __str__(self):
        return self.seller_id

class CatalogueData(models.Model):
    cat_id = models.CharField(max_length=30)
    cat_name = models.CharField(max_length=50)
    cat_year = models.CharField(max_length=60)
    seller = models.ForeignKey(SellerData,on_delete=models.CASCADE,
related_name='catalogue')

    def __str__(self):
        return self.cat_id

class ItemsData(models.Model):
    item_id = models.CharField(max_length=30)
    item_name = models.CharField(max_length=40)
    catalogue = models.ForeignKey(CatalogueData,on_delete=models.CASCADE,
related_name='items')

    def __str__(self):
        return self.item_id

class ModelsData(models.Model):
    model_id = models.CharField(max_length=100)
    model_name = models.CharField(max_length=100)
    items = models.ForeignKey(ItemsData,on_delete=models.CASCADE,
related_name='models')

    def __str__(self):
        return self.model_id 

Серилизатор выглядит так:

class ModelsDataSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.ModelsData
        exclude=('items',)


class ItemsDataSerializer(serializers.ModelSerializer):
    accounts= ModelsDataSerializer(many=True)
    class Meta:
        model = models.ItemsData
        exclude=('CatalogueData_id',)

class CatalogueDataSerializer(serializers.ModelSerializer): 
    statements=ItemsDataSerializer(many=True)
    class Meta:
        model = models.CatalogueData
        exclude=('customer_id',)


class SellerDataSerializer(serializers.ModelSerializer):
    CatalogueDatas= CatalogueDataSerializer(many=True)
    class Meta:
        model = models.SellerData
        fields = '__all__'

    def create(self, validated_data):
        # get CatalogueDatas
        catalogues_data = validated_data.pop('catalogues')
        seller = models.SellerData.objects.create(**validated_data)
        for catalogue_data in catalogues_data:
            # get statements data
            items_data = catalogues_data.pop('items')
            catalogue_data['seller_id']=seller
            catalogue=models.CatalogueData.objects.create(**catalogue_data)
            for item_data in items_data:
                models_data = item_data.pop('models')
                item_data['catalogue']=catalogue
                item=models.ItemsData.objects.create(**item_data)
                for model_data in models_data:
                    model_data['items']=item
                    models.ModelsData.objects.create(**model_data)


        return seller

myViewset записывается как:

serializer_class=serializers.SellerDataSerializer
    queryset=models.SellerData.objects.values_list('seller_id')

Ожидается получить что-то вроде


{
   "seller_id":"1",
   "seller_id":"2"

}

Но я вернусь

{
    "seller_name":"Super Cust",
    "seller_id" :"1234",
    "catalogue":[
        {
                "cat_id":"order-1",
                "cat_name":"furniture",
                "cat_year":"2019",
                "items":[

                        {
                            "item_id":"item_1",
                            "item_name":"sofa",
                            "models":[
                                {   
                                    "model_id":"10001",
                                    "model_name":"White"
                                },
                                {
                                    "model_id":"10002",
                                    "model_name":"Blue"
                                }
                            ]

                        }
                            ]


                        }


                ]


        }
    ]



 }

1 Ответ

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

Это происходит потому, что вы вкладываете сериализаторы. Если вы хотите, чтобы SellerDataSerializer выводил только идентификаторы продавцов, удалите вложенный сериализатор, например:

class SellerDataSerializer(serializers.ModelSerializer):

    class Meta:
        model = models.SellerData
        fields = '__all__'
...