Django 管理员没有错误 - 隐藏高级查找部分



我让这个查询工作正常。

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']

最新更新