我想知道有没有相当于:
select columnname from tablename
像Django教程所说:
Entry.objects.filter(condition)
获取具有给定条件的所有对象。它就像:
select * from Entry where condition
但我想列出一个列[在我的例子中是一个外键]。发现:
Entry.objects.values_list('column_name', flat=True).filter(condition)
做同样的事情。但在我的情况下,该列是外键,并且此查询丢失了外键的属性。它只是存储值。我无法进行查询。
答案 0 :(得分:58)
当然,values
和values_list
将从数据库中检索原始值。 Django无法在模型上运行它的“魔力”,这意味着你不能遍历关系,因为你被外键指向的id所困,而不是ForeignKey字段。
如果您需要过滤这些值,可以执行以下操作(假设column_name
是指向MyModel
的ForeignKey):
ids = Entry.objects.values_list('column_name', flat=True).filter(...)
my_models = MyModel.objects.filter(pk__in=set(ids))
的文档
答案 1 :(得分:9)
您的模型A
带有另一个模型B
的外键,您想要选择某些B
引用的A
。是对的吗?如果是这样,您想要的查询只是:
B.objects.filter(a__isnull = False)
如果您在相应的A
上有条件,则查询可以是:
B.objects.filter(a__field1 = value1, a__field2 = value2, ...)
请参阅Django's backwards relation documentation以获取有关其工作原理的说明,如果您想更改后向关系的名称,请参阅ForeignKey.related_name
option。
答案 2 :(得分:7)
要将查询集限制为您使用.values(columname)
的特定列您还应该在末尾添加distinct,因此您的查询将以:
结束Entry.objects.filter(myfilter).values(columname).distinct()
请参阅:https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.values
了解更多信息
根据您在评论中的回答,我会回来编辑。
编辑:
我不确定这种方法是否合适。您可以通过过滤器获取正常的查询集然后执行以下操作来获取python列表中的所有对象:
myobjectlist = map(lambda x: x.mycolumnname, myqueryset)
这种方法的唯一问题是如果你的查询集很大,你的内存使用量也会同样大。
无论如何,我仍然不确定问题的某些细节。