Django Q查询逻辑错误

时间:2014-02-23 21:12:10

标签: django django-models django-queryset django-q

我正在尝试创建一个具有方法'active_or_users'的管理器,以检索所有活动的帐户或用户创建的帐户。活动帐户的开始日期是今天或过去的某个地方,结束日期是某个未来的某个地方。现在active_or_users方法有效,但它返回同一对象的重复项。它返回用户创建的活动作业的三个副本。这不太理想。

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)

1 个答案:

答案 0 :(得分: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()