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_date优越性的对象datetime.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 字段来创建与未发布对象的关系。

IE。管理员将无法在 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 回答