簡體   English   中英

django - 內連接查詢集不起作用

[英]django - inner join queryset not working

我想要完成的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同樣的事情,它不會給我其他模型的結果。

總結一下,我希望顯示滿足某個子句的兩個表中的字段。

是什么賦予了?

似乎我一直在尋找錯誤的地方。 來自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一樣。 現在我可以專注於過濾結果,給我我想要的東西。

記住伙計們,你需要的信息幾乎總是在那里,這只是知道如何尋找它的問題:)

您正在尋找的可能是這個

queryset = Jobmst.objects.filter(id=3296).values_list(
    'id', 'name', 'jobmst_owner__cmd', 'jobmst_owner__params')

只使用一個查詢就可以獲得結果,並且應該可以使用sort進行排序。

PS來自SQL你可能會發現在django shell中使用queryset.query(由django生成的SQL)的一些很好的見解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM