Django:等同于“从[表名]中选择[列名]”

我想知道有什么等同于:

select columnname from tablename

就像Django教程中所说的:

Entry.objects.filter(condition)

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

select * from Entry where condition

但是我只想列出一列(在我的情况下是外键)。 发现:

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

一样。 但是在我的情况下,该列是外键,因此该查询丢失了外键的属性。 它只是存储值。 我无法拨打查询电话。

Anuj asked 2020-08-01T15:35:53Z
3个解决方案
60 votes

当然,values_list()MyModel将从数据库中检索原始值。 Django无法在模型上发挥其“魔力”,这意味着您无法遍历关系,因为您只能使用外键指向的id而不是ForeignKey字段。

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

ids = Entry.objects.values_list('column_name', flat=True).filter(...)
my_models = MyModel.objects.filter(pk__in=set(ids))

这是values_list()的文档

roam answered 2020-08-01T15:36:19Z
9 votes

您有一个型号A,它带有另一个型号B的外键,并且您想要选择一些A所引用的Bs,对吗? 如果是这样,您想要的查询就是:

B.objects.filter(a__isnull = False)

如果您在相应的ForeignKey.related_name上有条件,则查询可以是:

B.objects.filter(a__field1 = value1, a__field2 = value2, ...)

有关为什么这样做的解释,请参见Django的向后关系文档,如果要更改向后关系的名称,请参见ForeignKey.related_name选项。

Gareth Rees answered 2020-08-01T15:36:48Z
7 votes

要将查询集限制为特定列,请使用.values(列名)

您可能还应该在末尾添加与众不同的内容,因此您的查询最终将是:

Entry.objects.filter(myfilter).values(columname).distinct()

请参阅:[https://docs.djangoproject.com/zh-CN/dev/ref/models/querysets/#django.db.models.query.QuerySet.values]

想要查询更多的信息

根据您在评论中的回答,我将返回并进行编辑。

编辑:

我不确定这种方法是否正确。 您可以通过过滤器获取普通的查询集,然后执行以下操作,将所有对象存储在python列表中:

myobjectlist = map(lambda x: x.mycolumnname, myqueryset)

这种方法的唯一问题是,如果您的查询集很大,那么您的内存使用也将同样大。

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

James R answered 2020-08-01T15:37:44Z
translate from https://stackoverflow.com:/questions/9726691/django-equivalent-of-select-column-name-from-tablename