我在尝试设置查询时遇到了麻烦。
我有:
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 %}
答案 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}}比今天少{。}}。