Как выполнить запрос GROUP BY с помощью API QuerySet, который возвращает экземпляры модели, а не словари? - PullRequest
0 голосов
/ 11 января 2020

возможно ли создать список экземпляров модели вместо списка словарей при выполнении запроса GROUP BY? Я теряю функциональность экземпляра модели, когда экземпляр является словарем.

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)  
Product.objects.filter(is_published=True).values('enrollments__user').annotate(enrolled_user_count=Count('enrollments__user')).values('title','description','enrolled_user_count').order_by('-enrolled_user_count')

Я не смогу вызвать функцию is_parent () в теге шаблона, если я использую функцию values ​​() выполнить запрос GROUP BY

Ответы [ 2 ]

1 голос
/ 11 января 2020

Результат GROUP BY не является экземплярами модели - он содержит не заданную c строку таблицы, а только отдельные значения некоторого столбца (в простом случае), не связанные со всей строкой таблицы (экземпляром модели) вдоль с совокупным значением всех совпадающих строк.

Однако, если вы хотите добавить количество уникальных пользователей для каждой регистрации продукта, вы можете добавить Count() агрегат непосредственно в Product с предложением distinct в enrollments__client :

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'
)
0 голосов
/ 11 января 2020

Этот запрос вернет вам все Product объекты, которые опубликованы и будут помечены количеством пользователей

Product.objects.filter(
    is_published=True
).annotate(
    enrolled_user_count=Count('enrollments__user')
).order_by(
    '-enrolled_user_count'
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...