Django 如何使用QuerySet API执行分组查询,该API返回模型实例,而不是字典?

Django 如何使用QuerySet API执行分组查询,该API返回模型实例,而不是字典?,django,django-models,Django,Django Models,在执行分组查询时,是否可以创建模型实例列表而不是字典列表?当模型实例是字典时,我将失去该实例的功能 class Product(AbstractProduct): name = models.CharField(max_length=200, null=True, blank=True) description = models.CharField(max_length=10000, null=True, blank=True) is_published =

在执行分组查询时,是否可以创建模型实例列表而不是字典列表?当模型实例是字典时,我将失去该实例的功能

class Product(AbstractProduct):
      name = models.CharField(max_length=200, null=True, blank=True)
      description = models.CharField(max_length=10000, null=True, blank=True)
      is_published = models.BooleanField(default=False)
      picture = models.CharField(max_length=250, null=True, blank=True)
      user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='products', blank=True, null=True,on_delete=models.CASCADE)

      @property
      def is_parent(self):
          return self.structure == self.PARENT

class Enrollment(models.Model):
      product = models.ForeignKey("catalogue.Product", related_name='enrollments', blank=True,on_delete=models.CASCADE)
      user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='enrollments', blank=True,on_delete=models.CASCADE)  

如果我使用values()函数执行GROUP BY查询,我将无法在模板标记中调用is_parent()函数

此查询将获取所有已发布的
产品
对象,并将使用用户数进行注释

Product.objects.filter(
    is_published=True
).annotate(
    enrolled_user_count=Count('enrollments__user')
).order_by(
    '-enrolled_user_count'
)

groupby
的结果不是模型实例-它不包含表的特定行,只包含某些列的不同值(在简单情况下),与整个表行(模型实例)以及所有匹配行的聚合值无关

但是,如果您想添加每个产品注册的唯一用户数,您可以添加
count()
直接在
product
上使用
distinct
子句在
注册\uu客户机上进行聚合:

Product.objects.filter(
    is_published=True
).annotate(
    enrolled_user_count=Count('enrollments__user', distinct=True)
).values(
    'title', 'description', 'enrolled_user_count'
).order_by(
    '-enrolled_user_count'
)

你能分享你正在使用的模型和当前查询吗?你正在使用哪一个数据库?你只想得到一个带有用户数量注释的
产品列表吗?是的,这就是我试图做的。获取产品列表以及注册使用该产品的用户数的注释
Product.objects.filter(
    is_published=True
).annotate(
    enrolled_user_count=Count('enrollments__user', distinct=True)
).values(
    'title', 'description', 'enrolled_user_count'
).order_by(
    '-enrolled_user_count'
)