【发布时间】:2018-12-03 05:46:29
【问题描述】:
我有一个非常简单(第一眼)的问题。案例 - 一个产品可以在多个地方(商店)销售,每个产品都可以在一个商店中以不同的类别和子类别表示(这就是为什么类别通过 ForeignKey 与 Assortment 链接两次)。 所以这里是 My Assortment 模型,有几个 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)
视图,基于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 - 它可以工作,但是查询太多(对于每个父类别)。我试图通过我的'CategoryListSerializer' 使用'source' 选项来避免它,因为我做不到。每次,我都会得到 - '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,避免过多的查询)。
【问题讨论】:
标签: django django-rest-framework parent-child django-queryset