查询中的Django条件表达式

时间:2016-07-07 12:09:07

标签: django python-2.7 django-queryset

我有两个模型,一个ForeignKey我正在尝试匹配。为了做到这一点,我正在按特定的数字和日期查找第二个模型。问题是它有两个日期,我必须决定选择哪个日期。在某些情况下,它被设置为NULL,在某些情况下它不是。如果是的话我必须得到第二个日期字段。我有这样的事情:

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

第二种模式:

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

现在,如何做出选择?我查找了有关F expressionsQ expressionsWhen expressionsSelect的文档,我有点困惑。如何判断返回搜索到的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很新,所以任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分: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)
编辑:我想出了一个解决方案。确保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))