【问题标题】:django - inner join queryset not workingdjango - 内部连接查询集不起作用
【发布时间】: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 同样的事情,它不会给我其他模型的结果。

回顾一下,我想显示两个表中满足某个子句的字段。

什么给了?

【问题讨论】:

    标签: python django


    【解决方案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)发现一些很棒的见解。

      【讨论】:

        猜你喜欢
        • 2013-10-21
        • 1970-01-01
        • 2013-06-26
        • 1970-01-01
        • 1970-01-01
        • 2017-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多