[英]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.