Select DISTINCT individual columns in django?

前端 未结 4 1924
悲&欢浪女
悲&欢浪女 2020-11-28 04:10

I\'m curious if there\'s any way to do a query in Django that\'s not a \"SELECT * FROM...\" underneath. I\'m trying to do a \"SELECT DISTINCT columnName F

相关标签:
4条回答
  • 2020-11-28 04:50

    One way to get the list of distinct column names from the database is to use distinct() in conjunction with values().

    In your case you can do the following to get the names of distinct categories:

    q = ProductOrder.objects.values('Category').distinct()
    print q.query # See for yourself.
    
    # The query would look something like
    # SELECT DISTINCT "app_productorder"."category" FROM "app_productorder"
    

    There are a couple of things to remember here. First, this will return a ValuesQuerySet which behaves differently from a QuerySet. When you access say, the first element of q (above) you'll get a dictionary, NOT an instance of ProductOrder.

    Second, it would be a good idea to read the warning note in the docs about using distinct(). The above example will work but all combinations of distinct() and values() may not.

    PS: it is a good idea to use lower case names for fields in a model. In your case this would mean rewriting your model as shown below:

    class ProductOrder(models.Model):
        product  = models.CharField(max_length=20, primary_key=True)
        category = models.CharField(max_length=30)
        rank = models.IntegerField()
    
    0 讨论(0)
  • 2020-11-28 04:51

    User order by with that field, and then do distinct.

    ProductOrder.objects.order_by('category').values_list('category', flat=True).distinct()
    
    0 讨论(0)
  • 2020-11-28 05:01

    It's quite simple actually if you're using PostgreSQL, just use distinct(columns) (documentation).

    Productorder.objects.all().distinct('category')
    

    Note that this feature has been included in Django since 1.4

    0 讨论(0)
  • 2020-11-28 05:03

    The other answers are fine, but this is a little cleaner, in that it only gives the values like you would get from a DISTINCT query, without any cruft from Django.

    >>> set(ProductOrder.objects.values_list('category', flat=True))
    {u'category1', u'category2', u'category3', u'category4'}
    

    or

    >>> list(set(ProductOrder.objects.values_list('category', flat=True)))
    [u'category1', u'category2', u'category3', u'category4']
    

    And, it works without PostgreSQL.

    This is less efficient than using a .distinct(), presuming that DISTINCT in your database is faster than a python set, but it's great for noodling around the shell.

    0 讨论(0)
提交回复
热议问题