Проблема формулирования запроса Django между двумя таблицами - PullRequest
0 голосов
/ 06 июня 2019

Я прочитал подробно о запросах django .

Но, несмотря на мои попытки попробовать django forward запросы и backwards запросы Я просто не могу получить то, что хочу.

я написал прямой запрос:

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 FK для другой таблицы T соответствует локальной переменной в моем скрипте ed = request.GET.get('d', ''). По сути, этим пунктом я пытаюсь достичь T.dNm = ed. Я просто запутался, как добиться этого в моем форвард-запросе django.

я написал обратный запрос: ATFUS = TSF.objects.filter(FKToTld__dNm='123.123.13.1').values('sB','sE ')

Возвращает ошибку, из-за которой sB и sE недоступны для возврата значений, поскольку их нет в таблице 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 Ответ

1 голос
/ 06 июня 2019

Вы можете попробовать вот так (поскольку sB abd sE в TSFH модели, поэтому вам нужно поставить FKToTSFH__ перед sB и sE, как показано ниже):

TSF.objects.filter(FKToTld__dNm='123.123.13.1').values(<b>'FKToTSFH</b>__sB',<b>'FKToTSFH__</b>sE')

# with user

TSF.objects.filter(FKToTld__FKToUser=request.user).values(<b>'FKToTSFH</b>__sB',<b>'FKToTSFH__</b>sE')  # make sure user is authenticated

Немного более сложный способ получения этого результата - аннотировать значения sE и 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')

Использование

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)

Обновление 2:

Вы можете использовать isnull для проверки, существует ли нулевое значение:

# view
queryset = TSF.objects.filter(FKToTld__dNm='123.123.13.1', FKToTSFH__sB__isnull=False)
return ('template.html', context={'tsf': queryset})

# template

{% for i in tsf %}
    {{ i.FKToTSFH.sB }}
{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...