Я создаю каталог товаров для продавца. У продавца есть несколько каталогов.Каталог может содержать несколько элементов. Эти элементы могут содержать несколько моделей.
Теперь, основываясь на моем 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"
}
]
}
]
}
]
}
]
}