您的位置:

对于django错误AlreadyRegistered(msg)的解决

  发布时间:2023-04-05 16:55:33
报错的原因在 Django 中,当使用注册模型时,如果该模型已经被注册过,就会引发异常。解决方案是找到重复注册的地方并删除重复的注册,或者使用装饰器还可以使用这个函数在不同文件中注册模型另外还可以尝试重新运行Django的迁移命令来清除重复注册的模型

报错的原因

在 Django 中,当使用 `admin.site.register()` 注册模型时,如果该模型已经被注册过,就会引发 `AlreadyRegistered` 异常。这通常是由于在不同的应用程序或文件中重复注册模型造成的。

如何解决

为了解决这个问题,需要检查程序的代码,找到重复注册模型的地方并删除重复的注册。

另一种解决方案是使用 `admin.site.register()` 的 `decorator` 装饰器,如下所示:


@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
    ...

这种方式能够避免重复注册。

如果是因为在不同的应用程序中重复注册模型,可以在一个应用程序中注释或删除重复的注册。

如果你想要在同一个文件中注册多个模型,你可以使用django的内置函数 `register()`, 用来进行注册,这个函数会自动判断重复的模型并跳过。


from django.contrib import admin
admin.autodiscover()

另外,也可以尝试重新运行Django的迁移命令来清除重复注册的模型。


python manage.py makemigrations
python manage.py migrate

使用例子

是的,下面是一个简单的例子,假设在文件 `models.py` 中定义了模型 `MyModel`,在文件 `admin.py` 中使用了 `admin.site.register(MyModel)` 注册该模型。

models.py


from django.db import models

class MyModel(models.Model):
    name = models.CharField(max_length=100)

admin.py


from django.contrib import admin
from .models import MyModel

admin.site.register(MyModel)

如果在另一个文件或应用程序中也使用了 `admin.site.register(MyModel)` 注册该模型,就会出现 `AlreadyRegistered` 异常。

解决方案是找到重复注册的地方并删除重复的注册,或者使用 `admin.register()` 装饰器。


from django.contrib import admin
from .models import MyModel

@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
    list_display = ('name',)

还可以使用 `admin.autodiscover()` 这个函数在不同文件中注册模型。


from django.contrib import admin
admin.autodiscover()

另外还可以尝试重新运行Django的迁移命令来清除重复注册的模型。


python manage.py makemigrations
python manage.py migrate