2014-02-23 84 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()