查询中的 Django 条件表达式

Django conditional expressions in queries

我有两个模型,一个与 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 的文档,但我有点困惑。如何编写 returns 搜索 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 的新手,所以我们将不胜感激。

我已经解决了这个问题,我认为这不是最有效和最优雅的解决方法,但它确实有效。如果有人有更好的解决方案请post它。

首先,调用对应日期匹配的所有对象:

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))