Django 模型管理器继承

3

如何继承 ModelManager?

class Content(models.Model):
    name = models.CharField(max_length=255, verbose_name='Name des Blogs')
    slug = models.SlugField(max_length=80, blank=True)
    objects = models.Manager()
    active = ContentActiveManager()

class ContentActiveManager(models.Manager):
    def get_query_set(self):
        return super(ContentActiveManager,self).get_query_set().filter(activated=True,show=True)

class BlogCatalog(Content):
    frequency = models.PositiveSmallIntegerField(max_length=2, choices=make_index_based_tuple(l=FREQUENCY), verbose_name='Frequenz',)



blog = BlogCatalog.active.get(pk=1)

blog现在显然是一个Content对象。 如果我输入Catalog.active.get(pk=1),我想要一个Content对象, 但是如果我输入BlogCatalog.active.get(pk=1),我想要一个BlogCatalog对象。

如何避免冗余地实现这一点?

2个回答

2
Django只允许从抽象基类继承Manager。若要将同一管理器用作非ABC,则必须显式声明它。
请查看Django文档关于自定义管理器和继承
基本上,只需执行以下操作:
class BlogCatalog(Content):
    frequency = models.PositiveSmallIntegerField(max_length=2, choices=make_index_based_tuple(l=FREQUENCY), verbose_name='Frequenz',)
    active = ContentActiveManager()

希望能有所帮助。

是的,那很有帮助,谢谢您。 问题在于我总觉得我的想法可能不是解决这个问题最聪明的方式 :-/。 我考虑过只是给BlogCatalog一个ContentActiveManager,但我不确定这是否被认为是“好代码”。 感谢您的帮助 :)。 - self.name
是的,这就是 Django 开发人员设置事物的方式。只要 Content 不是 ABC,这被认为是“正确”的做法;-) - Gabriel Hurley

0

我找到的唯一方法:

class Content:

    @staticmethod
    def __new__(cls, *args, **kwargs):
        super_new = super(Content, cls).__new__(cls, *args, **kwargs)
        cls.add_to_class('active', ContentActiveManager())
        return super_new

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接