Django过滤器具有明显的和值问题

时间:2015-10-28 18:11:43

标签: python django

我有以下代码:

>>> y = Menu.objects.filter(level=1).values('name').distinct()
>>> y
[{'name': u'Desserts'}, {'name': u'Wings'}, {'name': u'Biriyani'}, {'name': u'Starters'}, {'name': u'Desserts'}, {'name': u'Starters'}, {'name': u'Biriyani'}]

它没有给我一个明确的结果集。我怎样才能实现不同的价值观?

根据这两个解决方案,我收到了错误:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/Users/abhishek.yeruva/workspace/myreps/lib/python2.7/site-packages/django/db/models/query.py", line 138, in __repr__
    data = list(self[:REPR_OUTPUT_SIZE + 1])
  File "/Users/abhishek.yeruva/workspace/myreps/lib/python2.7/site-packages/django/db/models/query.py", line 162, in __iter__
    self._fetch_all()
  File "/Users/abhishek.yeruva/workspace/myreps/lib/python2.7/site-packages/django/db/models/query.py", line 965, in _fetch_all
    self._result_cache = list(self.iterator())
  File "/Users/abhishek.yeruva/workspace/myreps/lib/python2.7/site-packages/django/db/models/query.py", line 1217, in iterator
    for row in compiler.results_iter():
  File "/Users/abhishek.yeruva/workspace/myreps/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 794, in results_iter
    results = self.execute_sql(MULTI)
  File "/Users/abhishek.yeruva/workspace/myreps/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 840, in execute_sql
    cursor.execute(sql, params)
  File "/Users/abhishek.yeruva/workspace/myreps/lib/python2.7/site-packages/django/db/backends/utils.py", line 79, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "/Users/abhishek.yeruva/workspace/myreps/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "/Users/abhishek.yeruva/workspace/myreps/lib/python2.7/site-packages/django/db/utils.py", line 97, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/Users/abhishek.yeruva/workspace/myreps/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
ProgrammingError: SELECT DISTINCT ON expressions must match initial ORDER BY expressions
LINE 1: SELECT DISTINCT ON ("myapp_menu"."name") "myapp_...

3 个答案:

答案 0 :(得分:2)

使用values_list代替值,并在values_list中设置平面参数:

y = set(Menu.objects.filter(level=1).values_list('name', flat=True))

将您的值列表传递给set函数,它会创建一个具有唯一值的集合,例如Joey Wilhelm在评论中写道。

答案 1 :(得分:2)

替代Dima的解决方案,如果您使用PostgreSQL,您可以指定执行不同查询的字段,如.distinct() documentation中所述。例如:

y = Menu.objects.filter(level=1).distinct('name').values('name')

答案 2 :(得分:1)

请参阅note here - 如果您使用的是order_by,则您订购的字段将包含在DISTINCT中。您不会在查询中显示order_by,但如果您的Meta模型的Menu类中有一套,则仍会适用。