使用不相关的字段从模型中获取信息

时间:2017-09-23 18:07:41

标签: django django-models django-queryset

我有这两个模型:

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')

会起作用,但由于它们不相关也无关联,我该如何处理?

2 个答案:

答案 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更具可读性。)