django - 内部连接查询集不起作用
Posted
技术标签:
【中文标题】django - 内部连接查询集不起作用【英文标题】:django - inner join queryset not working 【发布时间】:2013-12-17 03:11:59 【问题描述】:我要完成的SQL是这样的——
SELECT jobmst_id, jobmst_name, jobdtl_cmd, jobdtl_params FROM jobmst
INNER JOIN jobdtl ON jobmst.jobdtl_id = jobdtl.jobdtl_id
WHERE jobmst_id = 3296
我只在 django 中通过 annote 和 order_by 进行了一次内部连接,但我似乎无法让它在 prefetch_related() 或 select_related() 中工作
我的模型就是这样 -
class Jobdtl(models.Model):
jobdtl_id = models.IntegerField(primary_key=True)
jobdtl_cmd = models.TextField(blank=True)
jobdtl_fromdt = models.DateTimeField(blank=True, null=True)
jobdtl_untildt = models.DateTimeField(blank=True, null=True)
jobdtl_fromtm = models.DateTimeField(blank=True, null=True)
jobdtl_untiltm = models.DateTimeField(blank=True, null=True)
jobdtl_priority = models.SmallIntegerField(blank=True, null=True)
jobdtl_params = models.TextField(blank=True) # This field type is a guess.
class Meta:
managed = False
db_table = 'jobdtl'
class Jobmst(MPTTModel):
jobmst_id = models.IntegerField(primary_key=True)
jobmst_type = models.SmallIntegerField()
jobmst_prntid = TreeForeignKey('self', null=True, blank=True, related_name='children', db_column='jobmst_prntid')
jobmst_name = models.TextField(db_column='jobmst_name', blank=True)
# jobmst_owner = models.IntegerField(blank=True, null=True)
jobmst_owner = models.ForeignKey('Owner', db_column='jobmst_owner', related_name = 'Jobmst_Jobmst_owner', blank=True, null=True)
jobmst_crttm = models.DateTimeField()
jobdtl_id = models.ForeignKey('Jobdtl', db_column='jobdtl_id', blank=True, null=True)
jobmst_prntname = models.TextField(blank=True)
class MPTTMeta:
order_insertion_by = ['jobmst_id']
class Meta:
managed = True
db_table = 'jobmst'
我有一个非常简单的看法 -
# Test Query with Join
def test_queryjoin(request):
queryset = Jobmst.objects.filter(jobmst_id=3296).order_by('jobdtl_id')
queryresults = serializers.serialize("python", queryset, fields=('jobmst_prntid', 'jobmst_id', 'jobmst_prntname', 'jobmst_name', 'jobmst_owner', 'jobdtl_cmd', 'jobdtl_params'))
t = get_template('test_queryjoin.html')
html = t.render(Context('query_output': queryresults))
return HttpResponse(html)
我尝试了很多事情 -
queryset = Jobmst.objects.all().prefetch_related()
queryset = Jobmst.objects.all().select_related()
queryset = jobmst.objects.filter(jobmst_id=3296).order_by('jobdtl_id')
还有一些我忘记了。
每次我得到的 json 都来自 jobmst 表,没有提到我想要的 jobdtl 结果。如果我走另一条路并做 Jobdtl.objects.xxxxxxxxx 同样的事情,它不会给我其他模型的结果。
回顾一下,我想显示两个表中满足某个子句的字段。
什么给了?
【问题讨论】:
【参考方案1】:似乎我一直在寻找错误的地方。来自 SQL,我一直在考虑内部连接表,这不是它的工作原理。我正在加入模型的结果。
因此,重新考虑我的搜索时,我遇到了 itertools 和链函数。
我的 views.py 中的 def 现在有 2 个查询
from itertools import chain
jobmstquery = Jobmst.objects.filter(jobmst_id=3296)
jobdtlquery = Jobdtl.objects.filter(jobdtl_id=3296)
queryset = chain(jobmstquery, jobdtlquery)
queryresults = serializers.serialize("python", queryset)
这向我显示了每个表“加入”的结果,就像我在 SQL 中想要的那样。现在我可以专注于过滤结果以提供我想要的结果。
请记住,您需要的信息几乎总是在那里,只是知道如何寻找它:)
【讨论】:
【参考方案2】:你要找的可能是这个
queryset = Jobmst.objects.filter(id=3296).values_list(
'id', 'name', 'jobmst_owner__cmd', 'jobmst_owner__params')
您只需要一个查询就可以得到结果,并且您应该能够对它使用排序。
附:来自 SQL,您可能会在 django shell 中使用 queryset.query(由 django 生成的 SQL)发现一些很棒的见解。
【讨论】:
以上是关于django - 内部连接查询集不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Django defer() 和 only() 查询集不起作用?