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

时间:2016-03-18 02:47:18

标签: python django django-admin

我的查询工作正常。

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)

我没有收到错误 - 管理员只是没有加载与标签相关的字段。

1 个答案:

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