2015-10-26 213 views
0

我在尝试获取查询集时遇到问题。在django中过滤多个字段

我:

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) 

所以我尝试让所有的产品。并且只显示开始日期大于datetime.now()的RangeDates。我不知道一个查询集是否可以给出这个结果,或者如果我需要在一个循环中对待它们。

我还需要订购产品中的日期

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

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

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

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

0123:

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

然后在模型中我检查的日期做了一个功能

,我把它叫做模板:

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

和排序过滤器标签:

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

回答

1

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

这个查询应该努力让所有的产品与开始日期后的今天:

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

基础上编辑,如果你需要的是有开始日期,经过是所有产品列表'现在',那么这只是一些布尔操作的问题:

“产品的所有范围的开始大于现在”等同于“产品的范围小于现在”。可与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,比现在少了start_date

+0

这不起作用。因为如果产品与RangeDate大于和小于1的产品有关系,则它也会提供产品。 –

+0

当我最初回答问题时,这不是问题的一部分,我会根据更新情况了解是否可以改进。 –

+1

@Lego Stormtroopr,'Q()'是qool,但是你也可以使用'.objects.exclude()'而不是'.objects.filter()' – Art