我让这个查询工作正常。
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,但我在产品模型中没有看到性别字段。我只是假设它在那里,为了简洁起见,你把它省略了。
在您的工作示例中,您将使用以下命令过滤变体对象:
filter(size__stock__stock__in=[1,2])
在您的管理员示例中,您尝试过滤具有相同定义的产品,但产品没有尺寸属性。试试这个:
filter(variation__size__stock__stock__in=[1,2])
若要从此查询集中获取不同变体对象的计数,需要使用聚合:
.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']