У меня очень простая (на первый взгляд) проблема.Случай - товар может быть продан в нескольких местах (магазинах), и каждый товар может быть представлен в одном магазине с разными категориями и подкатегориями (поэтому категории, связанные через ForeignKey с Ассортиментом дважды).Итак, вот модель «Мой ассортимент» с несколькими FK.
class Assortment(models.Model):
category = models.ForeignKey('category.Category', null=True, blank=True, default=None,related_name='assortment_child')
parent_category = models.ForeignKey('category.Category', null=True, blank=True, default=None,related_name='assortment_parent')
product = models.ForeignKey(Product)
shop = models.ForeignKey(Shop)
View, основанная на rest_framework.generics.ListAPIView
class InstitutionTreeCategories(generics.ListAPIView):
"""Resource to get shop's tree of categories."""
serializer_class = serializers.InstitutionCategoriesSerializer
def get_queryset(self):
shop = self.get_shop()
return Category.objects.filter(assortment_parent__shop=shop).distinct()
И, наконец, сериализаторы
class CategoryListSerializer(serializers.ModelSerializer):
class Meta:
"""Meta class."""
model = Category
fields = ('id', 'name', 'image')
class CategoriesTreeSerializer(CategoryListSerializer):
# childs = CategoryListSerializer(many=True, source='assortment_child__parent_category')
childs = serializers.SerializerMethodField()
class Meta(CategoryListSerializer.Meta):
"""Meta class."""
fields = ('id', 'name', 'image', 'childs')
def get_childs(self, obj):
qs = Category.objects.filter(assortment_child__parent_category=obj.id).distinct()
return CategoryListSerializer(qs, many=True, context=self.context).data
И мне нужно показать дерево категорий для одного магазина с моим API.Но проблема в том, что - если я использую serializer.SerializerMethodField - он работает, но слишком много запросов (для каждой родительской категории).Я пытался избежать этого, используя опцию 'source' с моим 'CategoryListSerializer', но не могу этого сделать.Каждый раз я получаю - 'Category' object has no attribute assortment_child__parent_category
.В модели оболочки я пробовал
In [8]: cat.assortment_parent.values('category').distinct()
Out[8]: (0.003) SELECT DISTINCT "marketplace_assortment"."category_id" FROM "marketplace_assortment" WHERE "marketplace_assortment"."parent_category_id" = 4 LIMIT 21; args=(4,)
<AssortmentQuerySet [{'category': 3}]>
Итак, у объекта категории есть эти атрибуты, конечно, он есть, я использовал его методом get_childs.Так что вопрос - как я могу использовать его с serializer.ModelSerializer и его вариант источника?(Конечно, используя метод select_related с queryset, чтобы избежать лишних запросов).