2016-07-07 2 views
0

У меня две модели: одна с ForeignKey Я пытаюсь сопоставить. Чтобы сделать это, я просматриваю вторую модель по определенному числу и дате. Проблема в том, что у него две даты, и я должен принять решение о том, какую дату выбрать. В некоторых случаях он установлен в NULL, в некоторых - нет. Если это, я должен получить второе поле даты. У меня есть что-то вроде этого:Условные выражения Django в запросах

class MyModel1(models.Model): 
    model2_key = models.ForeignKey(MyModel2) 
    model1_date=... 
    model1_number=... 

вторая модель:

class MyModel2(models.Model): 
    model2_date1=... 
    model2_date2=... 
    model2_number=... 

Теперь, как сделать выбор? Я просмотрел документацию относительно F expressions, Q expressions, When expressions, Select, и я немного смущен. Как я могу найти функцию, которая возвращает искомый объект MyModel2? У меня есть что-то подобное, но это не сработает.

def _find_model2(searched_date, searched_number): 
    searched_model2=MyModel2.objects.get(Q(model2_number=searched_number), 
        Q(When(model2_date1__e='NULL', then=model2_date2) | 
        Q(When(model2_date1__ne='NULL', then=model2_date1))=searched_date)) 

Я совершенно новичок в django, поэтому любая помощь будет оценена.

ответ

0

Я сделал обходной путь этой проблемы, я не думаю, что это очень эффективный и изящный, но он работает. Если у кого-то есть лучшее решение, отправьте его.

Во-первых, все объекты, соответствующие даты совпадают, называются:

from_query = list(MyModel2.objects.filter(Q(model2_date1__range= 
(datetime_min, datetime_max)) | Q(model2_date2__range=(datetime_min, datetime_max)), 
    model2_number=searched_number)) 

Тогда я перебирать найденные объекты:

to_return = [] 
for item in from_query: 
    if item.model2_date1: 
     to_return.append(item) 
    elif datetime_min <= item.model2_date2 <= datetime_max: 
     to_return.append(item) 

EDIT: Я пришел с решением. Обеспечение достаточности model2_date1__isnull=True. Решение теперь выглядит следующим образом:.

from_query = list(MyModel2.objects.get((Q(model2_date1__range=(datetime_min, datetime_max)) | 
               Q(Q(model2_date2__range=(datetime_min, datetime_max)), 
               Q(model2_date1__isnull=True)), 
               model2_number=searched_number)) 
+0

ли 'MyModel2.objects.filter (Q (model2_date1 = searched_date) | Q (model2_date2 = searched_date)) фильтр (model2_number = searched_number)' не работает? – Justin

+0

Иногда иногда создается одна из дат, и это критерий, на котором я должен решить, соответствует ли объект запросу или нет. – gonczor

Смежные вопросы