我有这两个模型:
class A(models.Model):
name=models.CharField(max_length=10)
class D(models.Model):
code=models.IntegerField()
代码字段可以具有模型A中存在的数字,但由于其他因素,它不能相关。但我想知道的是列出A中的项目,其值与代码
相同items=D.objects.values('code__name')
会起作用,但由于它们不相关也无关联,我该如何处理?
答案 0 :(得分:1)
您可以使用django extra,替换真实应用名称上的YOUAPP
D.objects.extra(select={'a_name': 'select name from YOUAPP_a where id=code'}).values('a_name')
# Replace YOUAPP^^^^^
答案 1 :(得分:0)
您可以在 Django 1.11 或更新版本中使用Subquery() expressions。
qs
D
的输出是对象code_name
的查询集,其中添加了字段SELECT app_d.id, app_d.code,
(SELECT U0.name FROM app_a U0 WHERE U0.id = (app_d.code)) AS code_name
FROM app_d
。
脚注:
它被编译成一个非常相似的SQL(就像Bear Brown的“额外”方法的解决方案,但没有他的解决方案的缺点,请参见):
.values()
如果需要字典输出,最后可以通过code = models.IntegerField(none=True)
进行转换。它可以像左连接一样工作,即如果伪相关字段允许空(extra(select={...: "SELECT ..."})
),则对象D不受限制,输出code_name值可以是None。 Subquery的一个特性是它只返回一个字段表达式,最后必须为另一个字段重复。 (这类似于{{1}},但是由于对象语法,它可以比显式SQL更具可读性。)