Django:等同于"从[tablename]"中选择[列名]

时间:2012-03-15 19:23:25

标签: django django-models

我想知道有没有相当于:

select columnname from tablename

像Django教程所说:

Entry.objects.filter(condition)

获取具有给定条件的所有对象。它就像:

select * from Entry where condition

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

Entry.objects.values_list('column_name', flat=True).filter(condition)

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

3 个答案:

答案 0 :(得分:58)

当然,valuesvalues_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))

以下是values_list()

的文档

答案 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)

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

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