在两个表之间发布Django查询问题

时间:2019-06-06 18:52:14

标签: django django-queryset

我已经详细阅读了django queries

但是,尽管我努力尝试使用Django forward queriesbackwards queries,但我还是无法得到想要的东西。

我写了一个前向查询:

ATUFS =  TSFH.objects.filter(FKToUser=request.user).values('sB','sE')

这将返回:

{'sB': datetime.datetime(2019, 5, 21, 18, 14, 2, 691185, tzinfo=<UTC>), 'sE': datetime.datetime(2019, 5, 21, 18, 16, 2, 532731, tzinfo=<UTC>)}

但是对于该查询,我还需要进行查询,以确保TSF.FKToT到另一个表T的FK与我的脚本ed = request.GET.get('d', '')中的局部变量匹配。因此,从本质上来讲,我试图通过实现T.dNm = ed来实现此目的。我只是在django转发查询中困惑如何实现这一目标。

我写了一个向后查询: ATFUS = TSF.objects.filter(FKToTld__dNm='123.123.13.1').values('sB','sE ')

这将返回错误,表明sBsE不能返回其值,因为它们不在TSF表中。

在常规SQL中,我只是试图实现

SELECT sB, sE 
FROM TSF, TSFH,T
where TSFH.id=TSF.FKToTSFH_id and T.id=tsf.FKToT_id;

如何通过Django orm完成我想做的事情?

谢谢

更新后的视图/模板

Completed=TSF.objects.filter(FKToT__FKToUser=request.user,FKToTSFH__sE__isnull=False).values('FKToTSFH__sB','FKToTSFH__sE')
return render(request, 'view.html', {
'C':Completed

 })

{% if C %}
{% for res in C %}
<li><span>{{ res.FKToTSFH.sB }}</span></li>
{% endfor %}

这会产生空白输出的问题。

关于如何解决的任何想法。

1 个答案:

答案 0 :(得分:1)

您可以这样尝试(因为sBsE处于TSFH模型中,因此您需要将FKToTSFH__放在sB和{{1 }},如下所示:

sE

获得此结果的更复杂的方法是将TSF.objects.filter(FKToTld__dNm='123.123.13.1').values('FKToTSFH__sB','FKToTSFH__sE') # with user TSF.objects.filter(FKToTld__FKToUser=request.user).values('FKToTSFH__sB','FKToTSFH__sE') # make sure user is authenticatedsE的值注释到查询集,如下所示:

sB

用法

from django.db.models import F

TSF.objects.filter(FKToTld__dNm='123.123.13.1').annotate(sB=F('TSFH__sB'), sE=F('FKToTSFH__sE')).values('sB','sE')

更新2:

您可以使用isnull检查是否存在空值:

for item in TSF.objects.filter(FKToTld__dNm='123.123.13.1'):
     print(item.FKToTSFH.sB)
     print(item.FKToTSFH.sE)

for item in TSF.objects.filter(FKToTld__dNm='123.123.13.1').values('FKToTSFH__sB', 'FKToTSFH__sE'):
  print(item.get('FKToTSFH__sB'))
  print(item.get('FKToTSFH__sE'))

for (sB, sE) in TSF.objects.filter(FKToTld__dNm='123.123.13.1').values_list('FKToTSFH__sB', 'FKToTSFH__sE'):
  print(sB)
  print(sE)