Django 1.11向管理员添加了一个抽象基础模型

时间:2017-06-09 13:29:18

标签: django django-admin

我有一个抽象= True的基础模型。     #models.py

class Media(models.Model):          
    title = models.CharField(unique = True, max_length=200)
    excerpt = RichTextField(config_name = 'extralight', blank=True, null=True)  

    class Meta:
        abstract = True

模型图像,声音和文档是媒体模型的子类。我想获得所有媒体模型列表。

将抽象媒体模型添加到django admin的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

subclass  = Media.__subclasses__() 

这将返回Media

的所有子类

抽象模型不能直接用于管理员。

你必须将Media模型继承到另一个模型并创建没有抽象的模型然后你可以将子类模型添加到django admin。

答案 1 :(得分:0)

我要做的是将Media作为主要模型

然后为图像,声音和文档创建代理模型。

通过这种方式,您可以在一个数据库表yourapp_media中获得所有信息,并且您可以拥有一个或三个管理员。

from model_utils.managers import QueryManager
class Media(models.Model):          
    title = models.CharField(unique = True, max_length=200)
    content_type = models.SmallIntegerField(choices=settings.CONTENT_TYPE,editable=False)

    def __init__(self, *args, **kwargs):
        super(Media, self).__init__(*args, **kwargs)
        self.content_type = self.DEFAULT_CONTENT_TYPE

class Image(Media):
    DEFAULT_CONTENT_TYPE = settings.IMAGE_TYPE
    objects = QueryManager(content_type=settings.IMAGE_TYPE)
    class Meta:
        proxy = True

class Sound(Media):
    DEFAULT_CONTENT_TYPE = settings.SOUND_TYPE
    objects = QueryManager(content_type=settings.SOUND_TYPE)
    class Meta:
        proxy = True


class Document(Media):
    DEFAULT_CONTENT_TYPE = settings.DOCUMENT_TYPE
    objects = QueryManager(content_type=settings.DOCUMENT_TYPE)
    class Meta:
        proxy = True

在admin.py

admin.site.register(Media, MediaAdmin)
admin.site.register(Image, ImageAdmin)
admin.site.register(Sound, SoundAdmin)
admin.site.register(Document, DocumentAdmin)