我的查询运行良好。
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)
我没有收到错误 - 管理员只是没有加载与标签相关的字段。
请您参考如下方法:
我看到的第一件事是您正在过滤 gender=1 而我在 Product 模型中没有看到 gender 字段。我只是假设它就在那里,为了简洁起见,您将其省略了。
在您的工作示例中,您正在使用以下内容过滤 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']
