2015-12-25 5 views
0

У меня есть модель ресторана и модель расписания, которая имеет отношение внешнего ключа к Ресторану. В настоящее время я пытаюсь обратиться к ресторанам, которые открыты прямо сейчас. До сих пор я делалЗапрос с использованием значений внешнего ключа в Django с Q

qs = Restaurant.objects.all() 
qss = [] 
for q in qs: 
    schedule = q.schedule_set.filter(start_hour__lte=currHour, end_hour__gte=currHour) 
    if schedule: 
     qss.append(q) 

где currHour - текущий час, данный datetime.now().

Но мне интересно, могу ли я переписать этот запрос с помощью Q, так что, если мне нужно объединить этот запрос с другими запросами, я могу просто добавить дополнительные запросы к q = Q(), например.

ответ

2

Вы не должны делать эту итерацию по элементам запроса, когда вы действительно можете написать запрос для всего этого. Как вы его настроили сейчас, вы отправляете запрос БД для каждой итерации. Если я правильно понял ваш сценарий правильно, вы можете переписать его так, чтобы выдавать только один запрос, используя ForeignKey обхода:

qss = Restaurant.objects.filter(schedule__start_hour__lte=currHour, schedule__end_hour__gte=currHour) 

Затем вы можете добавить запросы к этому, как хорошо. filter() является цепным, поэтому вы также можете делать такие вещи, как:

q = Model.objects.filter(**filter_kwargs) 
q = q.filter(**additional_filter_kwargs) 
+0

Это именно то, что я хотел, спасибо! – user2857014