2014-02-23 52 views
2

我正在尝试创建一个管理器,该管理器拥有一个'active_or_users'方法来检索所有活动的帐户或用户已创建的帐户。活动帐户的开始日期既可以是今天,也可以是过去的某个地方,结束日期是未来的某个地方。现在,active_or_users方法可以工作,但它会返回同一对象的重复项。它返回用户创建的活动作业的三个副本。这并不理想。Django Q错误的查询逻辑

from django.db.models import Q 
from django.db import models 
from django.contrib.auth.models import User 

class ActiveJobs(models.Manager): 
    def active(self): 
     return super(ActiveJobs, self).get_query_set().\ 
      filter(publications__publish_on__lte=date.today(), 
        publications__end_on__gt=date.today()) 

    def active_or_users(self, user): 
     return super(ActiveJobs, self).get_query_set().\ 
      filter((Q(publications__publish_on__lte=date.today()) & 
        Q(publications__end_on__gt=date.today())) | Q(creator=user)) 

class Job(models.Model): 
    title = models.CharField(max_length=100) 
    slug = models.SlugField(blank=True, null=True) 
    creator = models.ForeignKey(User) 
    objects = ActiveJobs() 


class JobPublicationRecord(models.Model): 
    job = models.ForeignKey('Job', related_name='publications') 
    publish_on = models.DateField(auto_now=False) 
    end_on = models.DateField(auto_now=False, auto_now_add=False, 
           blank=True, null=True) 
+0

有您尝试使用[distinct](https://docs.djangoproject.com/en/1.6/ref/models/querysets/#django.db.models.query.QuerySet.distinct)方法? – tutuDajuju

+0

我没有。我相信这会起作用。我只是困惑为什么我三次得到同一个对象? – user2734679

+0

由于每个查询都会返回一个实例。 I.e:如果Job实例是由用户创建的,并且该作业的另一个实例(如果在指定的日期范围内)。 – tutuDajuju

回答

0

为了把各种意见,回答

随着OR查询,一个实例将用于查询的每个命中返回。即:如果作业是由用户和指定的相同工作的另一个实例,如果还日期范围内创建一个实例等

因此,要解决这个问题,改变方法active_or_users到:

def active_or_users(self, user): 
    return super(ActiveJobs, self).get_query_set().filter(
     (Q(publications__publish_on__lte=date.today()) & 
     Q(publications__end_on__gt=date.today())) | Q(creator=user)).distinct()