乐趣区

关于django:Django大坑之外键设置外键冲突

用 Django 开发了一个在线教育网站,家喻户晓,Django 是一个开发后端的一个弱小框架,用了它就不必管 MySQL 外面的增删改查,间接在 PyCharm 里迁徙搞定。
想在课程机构页显示课程信息表里的数据,就不得不用到外键。

本文将论述:
1、哪一个该做主键表?哪一个该做外键表?它们的区别是什么?
2、创立指向同一个模型的多个外键数据迁徙时报错怎么办?
3、Django 中指向同一模型的外键反向关联产生了抵触怎么办?
4、怎么给外键减少 related_name 属性, 自定义关联名称?
5、外键删除罕用属性介绍
6、数据迁徙中的常见谬误汇总
7、编程过程中遇到的一些问题和感悟

接下来,一一解答:
1、哪一个该做主键表?哪一个该做外键表?它们的区别是什么?
课程信息表蕴含课程机构表里的数据,即课程信息表须要填写是哪个机构,故将机构表和信息表做内连贯,机构表中的主键字段(机构名称)在信息表中做外键,而机构表没有外键,故机构表是主键表,信息表是外键表。
区别就是主键表的主键字段在外键表中做外键,而主键表本人却没有外键。
鸣谢今春看又过何日是归年的数据库中主键与外键的关系,通俗易懂

2、创立指向同一个模型的多个外键数据迁徙时报错怎么办?
解决办法:增加不同的 related_name,留神 related_name 的首个单词肯定不可雷同,否则会报错。
鸣谢 Aaron_MK 的 Django 的那些坑

3、Django 中指向同一模型的外键反向关联产生了抵触怎么办?
间接将 related_name 赋值为加号或以加号结尾的字符串,即可实现禁用反向映射
上代码

course_org = models.ForeignKey(CourseOrg,related_name='org_name+', null=True, blank=True,max_length=50,on_delete=models.SET_NULL, verbose_name="课程机构")
cname = models.ForeignKey(CourseOrg,related_name='course_name+',null=True, blank=True, max_length=50,on_delete=models.SET_NULL,verbose_name="课程名")

鸣谢少女狙击手的 python Django 反向拜访器的外键抵触解决

4、怎么给外键减少 related_name 属性, 自定义关联名称?
related_name=‘主键字段’
鸣谢 mmaotai 的 related_name 外表作用

5、外键删除罕用属性介绍
CASCADE: 这就是默认的选项,级联删除,你无需显性指定它。
PROTECT: 保护模式,如果采纳该选项,删除的时候,会抛出 ProtectedError 谬误。
SET_NULL: 置空模式,删除的时候,外键字段被设置为空,前提就是 blank=True, null=True, 定义该字段的时候,容许为空。
SET_DEFAULT: 置默认值,删除的时候,外键字段设置为默认值,所以定义外键的时候留神加上一个默认值。
SET(): 自定义一个值,该值当然只能是对应的实体了
鸣谢 lucky__peng 的 django 中 on_delete

6、数据迁徙中的常见谬误汇总
6.1ERRORS:
auth.User.groups: (fields.E304) Reverse accessor for ‘User.groups’ clashes with reverse accessor for ‘UserProfile.groups’.

HINT: Add or change a related_name argument to the definition for 'User.groups' or 'UserProfile.groups'.

auth.User.user_permissions: (fields.E304) Reverse accessor for ‘User.user_permissions’ clashes with reverse accessor for ‘UserProfile.user_permissions’.

HINT: Add or change a related_name argument to the definition for 'User.user_permissions' or 'UserProfile.user_permissions'.

users.UserProfile.groups: (fields.E304) Reverse accessor for ‘UserProfile.groups’ clashes with reverse accessor for ‘User.groups’.

HINT: Add or change a related_name argument to the definition for 'UserProfile.groups' or 'User.groups'.

users.UserProfile.user_permissions: (fields.E304) Reverse accessor for ‘UserProfile.user_permissions’ clashes with reverse accessor for ‘User.user_permissions’.

HINT: Add or change a related_name argument to the definition for 'UserProfile.user_permissions' or 'User.user_permissions'

用户认证模型类数据迁徙报错,报错起因:是继承了 AbstractUser 类, 没有在 setting 文件外面申明应用自定义的类 User。解决办法:在配置文件 settings 中申明应用自定义的 User 类:

# 指定应用自定义的模型类:
AUTH_USER_MODEL = 'users.User'
#users 是利用名称,User 是模型类的名称。

鸣谢 571428 的 python 用户认证模型类数据迁徙报错

6.2 The field admin.LogEntry.user was declared with a lazy reference to ‘user.user’,
but app ‘user’ doesn’t provide model ‘user’.
翻译过去就是用户应用程序‘用户’不提供模型‘用户’。
解决方案:1. 先把迁徙的文件删除掉。2. 而后把配置的数据库删掉从新创立。3. 从新创立后迁徙即可。
鸣谢菜鸟初成长的 django 执行迁徙文件报错 用户应用程序‘用户‘不提供模型‘用户‘

6.3Migration admin.0001_initial is applied before its dependency users.
呈现这种问题的起因是之前执行过 run manage.py task 中的:migrate,而后再次执行:migrate users #users 为 app 名称,解决办法是,删掉数据库中的所有表,并删除 app 下的 migrations 文件夹,而后再执行:makemigrations users, migrate users
鸣谢 geerniya 的 Django 报错——Migration admin.0001_initial is applied before its dependency users.

6.4raise FieldDoesNotExist(“%s has no field named ‘%s'” % (self.object_name, field_name))
django.core.exceptions.FieldDoesNotExist: CourseOrg has no field named ‘name’
其实只因为是你还没更改 adminx 文件。解决如下:把 class XXAdmin 里没有的字段删除即可。特地留神,adminx.py 外面的文件是展现后盾可选选项的,批改完 models.py 文件,也要改 adminx.py 文件。
鸣谢 django 的 raise FieldDoesNotExist(‘%s has no field named %r’ % (self.object_name, field_name))

7、编程过程中遇到的一些问题和感悟
MySQLdb._exceptions.ProgrammingError: (1146, “Table ‘mxonline.django_content_type’ doesn’t exist”)

遇到这个非凡的问题,问度娘无果后,认真翻看教程,发现要清空所有 migrations.py 文件夹下除__init__.py 的其余文件和 MySQL 数据库中的表后,再做迁徙,通过一次次失败后终于晓得在上步操作之后要把最底层人人都可调用的 users 表先做迁徙,在惯例迁徙其余的表。最初得出结论:机构表是主键表,课程表是外键表,机构表须要提供外键给课程表,提供完了之后,机构表写一个函数,用于导入课程表,views 外面写获取的逻辑(把 CourseOrg 作为一个对象传递进来),配置 url,交给 setting,在 html 文件中显示进去。

感悟就是要理分明问题的前因后果,一一击破,有些简单的问题要学会合成,毕竟当初还不是强人工智能时代,搜索引擎并没有足够“智能”,遇到不相熟的知识点,要学会被动补充背景常识。最初,要好好思考。

退出移动版