在django中过滤多个到多个字段

时间:2015-10-26 03:46:23

标签: python django django-models

我在尝试设置查询时遇到了麻烦。

我有:

class RangeDate(models.Model):
    start_date = models.DateTimeField(_("Start Date"))
    end_date = models.DateTimeField(_("End Date"))


class Product(models.Model):
    start_end_dates = models.ManyToManyField(RangeDate)

所以我试图获得所有产品。并且只显示RangeDates,开始日期大于datetime.now()。我不知道查询集是否可以提供该结果,或者我是否需要在循环中处理它们。

另外,我需要在产品中订购日期

希望你能帮助我。提前谢谢。

编辑1 所以我这样做,但我认为这可能是一个更好的方式:

product = Product.objects.filter(start_end_dates__start_date__gt=
                                   datetime.now())

但是如果产品有一个比现在更大,一个更低,它也给了我产品,它给了我重复的产品,所以我使用:

product = Product.objects.filter(start_end_dates__start_date__gt=
                                   datetime.now()).distinct()

然后在模型中我创建了一个检查日期的函数:

def is_older_than_now(self):
    return self.start_date < datetime.now()

我在模板中调用它:

 {% if not date.is_older_than_now %}
     ---
 {%endif}

和用于订购的过滤器标记:

{% for date in product.start_end_dates.all|order_by:"start_date" %}
    ---
{% endfor %}

1 个答案:

答案 0 :(得分:1)

您可能正在寻找__gt修饰符。可以像常规字段一样查询和过滤ManyToManyField,并且对相关模型中的字段进行过滤只需要一个dunderscore(__)。

此查询应该可以使所有产品在今天之后获得开始日期:

import datetime
Product.objects.filter(start_end_dates__start_date__gt=datetime.now())

根据编辑,如果你需要一个产品列表,其开始日期是“现在”之后 all ,那么这只是一些布尔摆弄的问题:

“所有范围的起点都大于现在”的产品相当于“产品的范围不小于现在”。可以使用a Q object完成:

from django.db.models import Q
Product.objects.filter(~Q(start_end_dates__start_date__lte=datetime.now()))

~Q(...)部分实际上是在说“不是这个查询(~)”,所以它说:

  

那些的人过滤产品start_end_dates的{​​{1}}比今天少{。}}。