3

次のモデルを検討してください。

class Artist(GalleryMixin, models.Model):
    name = models.CharField(max_length=200)


class Exhibition(GalleryMixin, models.Model):
    name = models.CharField(max_length=200, verbose_name=_(u'title'))
    artists = models.ManyToManyField('Artist')

ここで、 を追加し、ウェブサイト上でより優れたpublish_on DateTimeFieldオブジェクトを見たくないので、(ドキュメントを使用して) マネージャーを作成しました。これは次のようになります。publish_datedatetime.datetime.now()

class PublicObjectManager(models.Manager):
    use_for_related_fields = True

    def get_query_set(self):
        qs = super(PublicObjectManager, self).get_query_set()
        qs = qs.filter(publish_on__lte=datetime.datetime.now())
        return qs


class Artist(GalleryMixin, models.Model):
    name = models.CharField(max_length=200)
    publish_on = models.DateTimeField(null=True, blank=True)

    public_objects = PublicObjectManager()
    objects = models.Manager()


class Exhibition(GalleryMixin, models.Model):
    name = models.CharField(max_length=200, verbose_name=_(u'title'))
    artists = models.ManyToManyField('Artist')
    publish_on = models.DateTimeField(null=True, blank=True)

    public_objects = PublicObjectManager()
    objects = models.Manager()

これはうまく機能します。公開されていないオブジェクトはウェブサイトに表示されません...しかし、管理者は公開されていないオブジェクトを見ることができません! したがって、もちろん管理クエリセットをオーバーライドすることはできますが、リレーションクエリセットをオーバーライドするのは困難です。つまり、管理者はSelect フィールドを使用して、公開されていないオブジェクトへのリレーションを作成できませんでした。

すなわち。admin は、Exhibition.artists で公開されていないアーティストを選択できません。

これについてどう思いますか?

4

1 に答える 1

0

マネージャーを使用するのではなく、ベース オブジェクトにメソッドを記述するだけでこれを実行しました (「非表示の」ベース マネージャーの変更について覚えておく必要があるよりも読みやすいです)。

class Exhibition(GalleryMixin, models.Model):
  ...
  def publishedArtists(self):
    return self.artist_set.filter(publish_on__lte=datetime.datetime.now())

次に、テンプレートで次のことができます。

   {{exhibition.publishedArtists}}
于 2013-10-08T19:14:50.483 に答える