ValueError: Related model 'myapp.ExUser' cannot be resolved django扩展User字段

扩展字段目前有两种方法:

  1. 扩展字段 新建一张表->然后与原有表创建一对一关系
  2. 继承django.contrib.auth.models下的AbstractUser类 ,重写User

两种方式都是官方文档提到的,,实现方法可以在官网以及搜索引擎搜到各大佬的博客上,我今天只分享一下自己遇到的问题及解决方法

我采用的是第2种, 重写User的方法,但是在迁移数据库的时候,遇到问题,

编写好其它表之后,发现User表中字段需要添加于是在models.py 文件中添加了 ExUser

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

class ExUser(AbstractUser):
    phone = models.CharField(max_length=11, unique=True, blank=True)

class Post(models.Model):
    .......

在settings.py文件中添加

AUTH_USER_MODEL = 'app.ExUser'

添加完成后执行python manage.py makemigrations 然后报错

django.db.migrations.exceptions.CircularDependencyError: auth.0011_update_proxy_permissions, myqpp.0002_exuser_post

或者执行 python manage.py migrate 报错

ValueError: Related model ‘myapp.ExUser‘ cannot be resolved

然后开始各种查找资料,在官网的介绍中说

Changing to a custom user model mid-project?

Changing AUTH_USER_MODEL after you‘ve created database tables is significantly more difficult since it affects foreign keys and many-to-many relationships, for example.

This change can‘t be done automatically and requires manually fixing your schema, moving your data from the old user table, and possibly manually reapplying some migrations. See #25313 for an outline of the steps.

Due to limitations of Django‘s dynamic dependency feature for swappable models, the model referenced by AUTH_USER_MODEL must be created in the first migration of its app (usually called 0001_initial); otherwise, you‘ll have dependency issues.

In addition, you may run into a CircularDependencyError when running your migrations as Django won‘t be able to automatically break the dependency loop due to the dynamic dependency. If you see this error, you should break the loop by moving the models depended on by your user model into a second migration. (You can try making two normal models that have a ForeignKey to each other and seeing how makemigrations resolves that circular dependency if you want to see how it‘s usually done.)

大致的意思就是 项目写到一半,修改自定义用户模型,文中提到,在第一次创建数据库的时候,最好就已经开始使用自定义用户模型,否则等执行一次python manage.py makemigrations命令创建了0001_initial.py文件之后,,会形成一堆依赖关系,,想修改auth,就没有自动化了,,只能手动修改,并且会动态依赖会成为循环.............总之一句话,不好改了

如果被逼无奈,,可以去尝试 #25313,,里面提供了好多方法,可以一试.

我的选择是,,直接删库,,并且把migrations 文件夹下的除了*__init__.py*之外的文件清空,,重新创建数据库就行了

ValueError: Related model 'myapp.ExUser' cannot be resolved django扩展User字段

原文地址:https://www.cnblogs.com/nightwindnw/p/11025117.html

时间: 2024-10-07 14:38:43

ValueError: Related model 'myapp.ExUser' cannot be resolved django扩展User字段的相关文章

django扩展User模型(model),profile

from django.contrib.auth.models import User # Create your models here. class Profile(models.Model): user = models.OneToOneField(User, related_name='profile') date_of_birth = models.DateTimeField(blank=True, null=True) photo = models.ImageField(upload

analysed of J-SON/XML processing model Extend to java design model (J-SON/XML处理模型分析 扩展到Java设计模型 )

一.JSON和XML 1.JSON JSON(JavaScript Object Notation)一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.可在不同平台之间进行数据交换.JSON采用兼容性很高的.完全独立于语言文本格式,同时也具备类似于C语言的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)体系的行为.这些特性使JSON成为理想的数据交换语言. 2.XML 扩展标记语言 (Extensible Markup Language

Django 之 auth 模块

Django 内置一个 auth 模块,帮助用户实现注册.登录.注销以及修改密码等功能,帮助开发者省去了很多功夫. auth 模块 在创建模型时,Django内部会生成一个名为 auth_user 的数据表,用于存储认证的用户信息. auth 模块提供了一系列的方法,使用之前需要导入: from django.contrib import auth authenticate() 方法 提供用户认证功能,验证用户名和密码是否正确等.如验证成功,则返回一个 User 对象. from django.

如何正确使用 Django的User Model

本篇主要讨论一下User Model的使用技巧. 注意, 由于Django 1.5之后user model带来了很大的变化, 本篇内容只针对django 1.5之后的版本. 1. 确定 User Model 我们推荐一下方式来确定某一django项目使用的user model: # 使用默认User model时 >>> from django.contrib.auth import get_user_model >>> get_user_model() <cla

Django Model 定义语法

Django Model 定义语法 版本:1.7主要来源:https://docs.djangoproject.com/en/1.7/topics/db/models/ 简单用法 from django.db import models class Person(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30) 会自动生成SQL: CREA

自定义 Django的User Model,扩展 AbstractUser类注意事项

本篇主要讨论一下User Model的使用技巧. 注意, 由于Django 1.5之后user model带来了很大的变化, 本篇内容只针对django 1.5之后的版本. 1. 确定 User Model 我们推荐一下方式来确定某一django项目使用的user model: # 使用默认User model时 >>> from django.contrib.auth import get_user_model >>> get_user_model() <cla

model字段对象和forms字段对象的区别和联系

一.model字段对象 (一)_meta _meta是django.db.models.options.Options的实例,获取字段对象可通过模型类来进行获取,而_meta可提供如下功能: 获取模型的所有字段实例 通过名称获取模型的单个字段实例 1.获取模型的单个字段实例 In [19]: models.Book._meta.get_field("title") Out[19]: <django.db.models.fields.CharField: title> 2.获

extjs model store学习笔记

http://docs.sencha.com/extjs/6.2.0/guides/core_concepts/data_package.html // 定义一个ModelExt.define('MyApp.model.User', { extend: 'Ext.data.Model', fields: [ {name: 'name', type: 'string'}, {name: 'age', type: 'int'} ] }); // 定义一个storeExt.define('MyApp.

Django Model数据访问Making queries

创建完Model之后, Django 自动为你提供一套数据库抽象层的API,利用它可以完成创建,提取,更新,删除对象的操作. 以下面的Model为例: class Blog(models.Model): name = models.CharField(max_length=100) tagline = models.TextField() # On Python 3: def __str__(self): def __unicode__(self): return self.name class