模特和继承人

2024-05-16 05:21:22 发布

您现在位置:Python中文网/ 问答频道 /正文

今天偶然发现了一件很奇怪的事。你知道吗

我创建了一个可以显示问题的最小项目/应用程序。我就是这样做的:

virtualenv venv
. ./ven/bin/activate
pip install django==1.6 # That's the one we're using
django-admin.py startproject bla
cd bla
chmod +x manage.py
./manage.py startapp bla_app

bla/settings.py中:

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'bla_app',
)

AUTH_USER_MODEL = 'bla_app.MyUser'

bla_app/models.py中:

from django.db import models

from django.contrib.auth.models import AbstractUser

# Create your models here.


class MyUser(AbstractUser):
    super_name = models.CharField(max_length=254, unique=True)

然后,我运行syncdb命令:

./manage.py syncdb

它是按预期创建的。你知道吗

现在是棘手的部分。如果我更换型号.py并创建一个__init__.py文件,其中包含:

from my_user import MyUser

(前面的models.py作为my_user.py移到models/

然后我得到这些错误:

$ ./manage.py syncdb
CommandError: One or more models did not validate:
admin.logentry: 'user' has a relation with model bla_app.MyUser, which has either not been installed or is abstract.
auth.user: Model has been swapped out for 'bla_app.MyUser' which has not been installed or is abstract.

你知道这是怎么回事吗?你知道吗

我找到了that,但我不确定它们是否相关


Tags: djangofrompyimportauthappmanageadmin
2条回答

要将模型拆分为模块,必须提供app_label元选项。例如:

my_user.py

from django.db import models
from django.contrib.auth.models import AbstractUser


class MyUser(AbstractUser):
    super_name = models.CharField(max_length=254, unique=True)
    class Meta:
        app_label = 'bla_app'

正如@petkostas所说,django1.7(issue 4470)中不需要它

看看this answer,它描述了这个过程。你知道吗

Django希望模型类在models.py本身中定义,而不是在子模块中定义。它将尝试创建一个models.MyUser的实例,在您的例子中,它在Django的世界中并不存在,尽管您在my_user.py中定义了它

如果希望在单独的Python文件中定义每个模型,则需要创建型号.py手动导入它们的文件。如果你开始在这个应用程序中创建很多模型,那么这可能很难维护。你知道吗

app/
    __init__.py
    models.py
    _models/
        __init__.py
        my_user.py

models.py

from ._models.my_user import MyUser

相关问题 更多 >