【问题标题】:Django: Equivalent of "select [column name] from [tablename]"Django:相当于“从[表名]中选择[列名]”
【发布时间】:2012-04-01 08:55:32
【问题描述】:

我想知道有什么相当于:

select columnname from tablename

就像 Django 教程所说:

Entry.objects.filter(condition)

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

select * from Entry where condition

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

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

也是如此。但在我的情况下,该列是一个外键,这个查询失去了外键的属性。它只是存储值。我无法进行查找调用。

【问题讨论】:

  • 我开始写一个答案,现在我不确定了。你想让 django 从外键返回一个对象,还是你想要外键本身?

标签: django django-models


【解决方案1】:

当然,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()的文档

【讨论】:

  • 这可能有效,但如果是我,我对不得不对数据库进行两次调用感到不高兴。 @Gareth Rees 有一个更好的方法——翻转查询并从您想要的对象的角度编写它,并利用相关名称
  • 如何指定所有列?
【解决方案2】:

您有一个模型A 与另一个模型B 的外键,并且您想选择一些A 引用的Bs。那正确吗?如果是这样,您想要的查询只是:

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

【讨论】:

  • 我认为这是更好的方法,但您可能应该提到使用related_name
【解决方案3】:

要将查询集限制为特定列,请使用 .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)

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

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

【讨论】:

  • values() 给出了与 values_list() 相似的结果。我将“用户”列的值设为 1L、2L ......但外键关系丢失了。我无法访问“用户”类。
  • 一个类似的、同样不优雅的获取项目而不是 ID 的解决方案是:[instance.member 例如在 Entry.filter(condition).distinct('member')]
猜你喜欢
  • 2017-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-12
  • 2020-01-03
  • 1970-01-01
  • 2019-10-24
  • 1970-01-01
相关资源
最近更新 更多