Django:相当于"从[tablename]中选择[列名]"

Anu*_*nuj 44 django django-models

我想知道有没有相当于:

select columnname from tablename
Run Code Online (Sandbox Code Playgroud)

像Django教程说:

Entry.objects.filter(condition)
Run Code Online (Sandbox Code Playgroud)

获取具有给定条件的所有对象.它像是:

select * from Entry where condition
Run Code Online (Sandbox Code Playgroud)

但是我想列出一个列[在我的例子中是一个外键].发现:

Entry.objects.values_list('column_name', flat=True).filter(condition)
Run Code Online (Sandbox Code Playgroud)

做同样的事.但在我的情况下,该列是外键,并且此查询丢失了外键的属性.它只是存储值.我无法进行查询.

roa*_*oam 61

当然,values并将values_list从数据库中检索原始值.Django无法在模型上运行它的"魔力",这意味着你不能遍历关系,因为你被外键指向的id所困,而不是ForeignKey字段.

如果需要过滤这些值,可以执行以下操作(假设column_name是指向的ForeignKey MyModel):

ids = Entry.objects.values_list('column_name', flat=True).filter(...)
my_models = MyModel.objects.filter(pk__in=set(ids))
Run Code Online (Sandbox Code Playgroud)

这是一个文档 values_list()

  • 这可能有用,但如果是我,我世界不高兴不得不对数据库进行两次调用.@Gareth Rees有一个更好的方法 - 翻转查询并从你想要的对象的角度写它并利用相关的名称 (2认同)

Gar*_*ees 9

您有一个A带有外键的模型到另一个模型B,并且您想要选择B某些人引用的s A.是对的吗?如果是这样,您想要的查询只是:

B.objects.filter(a__isnull = False)
Run Code Online (Sandbox Code Playgroud)

如果你有相应的条件A,那么查询可以是:

B.objects.filter(a__field1 = value1, a__field2 = value2, ...)
Run Code Online (Sandbox Code Playgroud)

有关其原理的解释,请参阅Django的向后关系文档,如果要更改向后关系的名称,请参阅该ForeignKey.related_name选项.


Jam*_*s R 7

要将查询集限制为您使用的特定列.values(columname)

您还应该在末尾添加distinct,因此您的查询将以:

Entry.objects.filter(myfilter).values(columname).distinct()
Run Code Online (Sandbox Code Playgroud)

请参阅:https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.values

欲获得更多信息

根据您在评论中的答案,我会回来编辑.

编辑:

我不确定这种方法是否合适.您可以通过过滤器获取正常的查询集,然后执行以下操作来获取python列表中的所有对象:

myobjectlist = map(lambda x: x.mycolumnname, myqueryset)
Run Code Online (Sandbox Code Playgroud)

这种方法的唯一问题是如果你的查询集很大,你的内存使用量将同样大.

无论如何,我仍然不确定问题的某些细节.

  • values()给values_list()提供了类似的结果.我得到'用户'列值为1L,2L ...但外键关系丢失.我无法访问"用户"类. (2认同)