python - 为什么我不能用同一个模型注册多个 Django ModelAdmin?

标签 python django django-models django-admin

我有以下 ModelAdmin:

class EventAdmin(admin.ModelAdmin):
    # ModelAdmin config

    def queryset(self, request):
        queryset = super(EventAdmin, self).queryset(request)
        return queryset.exclude(date_end__lt=date.today())

admin.site.register(Event, EventAdmin)

现在我想添加一个模型来管理存档的(早于今天的)事件。

class EventArchiveAdmin(admin.ModelAdmin):
    # ModelAdmin config

    def queryset(self, request):
        queryset = super(EventArchiveAdmin, self).queryset(request)
        return queryset.filter(date_end__lt=date.today())

admin.site.register(Event, EventArchiveAdmin)

但如果我尝试这样做,我会得到 AlreadyRegistered 异常。

为什么我不能用相同的模型实现另一个 ModelAdmin,我怎样才能获得相同模型的不同管理 View

我知道我可以在我的类中实现自定义 list_filter,但我想将不同页面中的内容分开。

最佳答案

使用代理模型:

class Event(db.Model):
     ...

class ActiveEventManager(models.Manager):
    def get_queryset(self):
        return super(ActiveEventManager, self).get_queryset().filter(active=True)

class ActiveEvent(Event):
    class Meta:
        proxy = True

    objects = ActiveEventManager()

class ArchiveEventManager(models.Manager):
    def get_queryset(self):
        return super(ArchiveEventManager, self).get_queryset().filter(active=False)


class ArchiveEvent(Event):
    class Meta:
        proxy = True

    objects = ArchiveEventManager()

现在,您可以注册 2 个模型而无需覆盖 ModelAdmin.queryset 方法:

class EventAdmin(admin.ModelAdmin):
    # ModelAdmin config

admin.site.register(ActiveEvent, EventAdmin)
admin.site.register(ArchiveEvent, EventAdmin)

您可以阅读有关 proxy models 的模式和 managers在文档中。

另外,使用这个:

queryset = super(EventArchiveAdmin, self).queryset(request)

作为第一个参数 super() 采用 current 类。参见 doc

注意django在django==1.7中将Manager.get_query_set重命名为Manager.get_queryset

关于python - 为什么我不能用同一个模型注册多个 Django ModelAdmin?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12790220/

相关文章:

django - 整个模型为只读

python - Tensorflow 2 API : The name tf. get_default_graph 已弃用。请改用 tf.compat.v1.get_default_graph

python - 应用程序窗口标题以及多个主窗口的文件路径

python - 当列为varchar时,django从mysql中选择最大字段

javascript - 如何正确地将模板从 HTML5 UP 导入到 django

python - 包含另一个模型列表的 Django 模型

python - 访问远程相关 Django 模型的最佳实践

Python3 - 在 if 条件下使用 for 循环

python - 存储和重新加载 matplotlib.pyplot 对象

python - Django Rest框架序列化器没有给出预期的输出