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() 查询集不起作用?

mysqli连接在函数内部不起作用? [复制]

构造一个 django 查询集,用于对内部连接进行排序

MS Access 更新查询和带字符串参数的内部连接

仅在 django 中创建基于更新类的视图时,为我的文件上传使用表单集不起作用

SQL 查询不起作用 - 聚合和连接