2

アクティブなアカウント、またはユーザーが作成したすべてのアカウントを取得するメソッド「active_or_users」を持つマネージャーを作成しようとしています。アクティブなアカウントには、開始日が今日または過去のどこかであり、終了日が将来のどこかです。現在、active_or_users メソッドは機能しますが、同じオブジェクトの複製を返します。ユーザーが作成したアクティブなジョブの 3 つのコピーを返しています。これは理想的とは言えません。

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)
4

1 に答える 1

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()
于 2014-02-23T21:36:58.417 に答える