Django GROUP BY field value

后端 未结 1 1412
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-29 13:30

Surprising that I could not find a way to make a group by query.

I have a query set qs and I am trying to group by some_prop.val, consideri

相关标签:
1条回答
  • 2020-12-29 14:09

    There is not a specific Django ORM way (as far as I know) but you can do the following to get a dictionary of entries grouped by values of a field:

    1. Use .values_list() with flat=True to get a list of the existent values in your database (if you don't know them beforehand). Also use .distinct() to elimintae duplicate values as we do not care for those:

      value_list = MyModel.objects.values_list(
          'interesting_field', flat=True
      ).distinct()
      
    2. Now iterate through value_list and fill your dictionary:

      group_by_value = {}
      for value in value_list:
          group_by_value[value] = MyModel.objects.filter(interesting_field=value)
      

    Now group_by_value dictionary contains as keys the distinct values in your interesting_field and as values the queryset objects, each containing the entries of MyModel with interesting_field=a value from value_list.




    Leaving this here for comment legacy reasons.

    I have made a Q&A style example in, which simulates a COUNT ... GROUP BY SQL query.

    Essentially you need to utilize the .order_by for grouping and the .annotate() to count on the model's .values().

    Here is the above-mentioned example:

    We can perform a COUNT ... GROUP BY SQL equivalent query on Django ORM, with the use of annotate(), values(), order_by() and the django.db.models's Count methods:

    Let our model be:

    class Books(models.Model):
        title  = models.CharField()
        author = models.CharField()
    

    Lets assume that we want to count how many book objects per distinct author exist in our Book table:

    result = Books.objects.values('author')
                          .order_by('author')
                          .annotate(count=Count('author'))
    

    Now result contains a queryset with two columns: author and count:

      author    | count
    ------------|-------  
     OneAuthor  |   5 
    OtherAuthor |   2    
       ...      |  ...
    
    0 讨论(0)
提交回复
热议问题