我的查询工作正常。
Variation.objects.filter(size__stock__stock__in=[1,2]).filter(product__tag__name__in=['Basics', 'This']).distinct('product').count()
但是,我无法在admin.py中使用它来显示查询中单个产品的计数方式。
class TagAdmin(admin.ModelAdmin):
...
def male_only_count(self, obj):
return obj.product_set.filter(gender=1).filter(size__stock__stock__in=[1,2]).distinct('product').count()
我想做什么:
试图找到>标签名称为' XYZ'的商品,其库存级别为' 3'。
查找将类似于股票级别>尺寸>变化>产品>标签
我的模特:
class Tag(models.Model):
name = models.CharField(max_length=100, blank=False)
class Product(models.Model):
name = models.CharField ("Name", max_length=400)
tag = models.ManyToManyField(Tag, blank=True)
class Variation(models.Model):
product = models.ForeignKey(Product, db_index=True, blank=False, null=False)
variation = models.CharField (max_length=80, blank=True)
class Size(models.Model):
variation = models.ForeignKey(Variation, blank=False, null=False)
size = models.CharField("Size", max_length=100, blank=True)
Stock_CHOICES = (
(1, 'In Stock'),
(2, 'Low Stock'),
(3, 'Out of Stock'),
(4, 'Discontinued'),
)
class Stock(models.Model):
size = models.ForeignKey(Size, blank=False, null=False)
stock = models.IntegerField(choices=Stock_CHOICES)
created = models.DateTimeField("Created", auto_now_add=True)
我没有收到错误 - 管理员只是没有加载与标签相关的字段。
答案 0 :(得分:2)
我看到的第一件事是你正在过滤性别= 1而我没有在产品型号中看到性别字段。我只是假设它在那里而你为了简洁而把它留下了。
在您的工作示例中,您使用以下方法过滤Variation对象:
filter(size__stock__stock__in=[1,2])
在您的管理示例中,您尝试使用相同的定义过滤产品但产品没有尺寸属性。试试这个:
filter(variation__size__stock__stock__in=[1,2])
要从此查询集中计算不同的Variation对象,您需要使用聚合:
.aggregate(num_variations=Count('variation', distinct=True))
全部放在一起:
return obj.product_set.filter(gender=1).filter(variation__size__stock__stock__in=[1,2]).aggregate(num_variations=Count('variation', distinct=True))['num_variations']