我用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="CourseOrganization")cname=models.ForeignKey(CourseOrg,related_name='course_name+',null=True,blank=True,max_length=50,on_delete=models.SET_NULL,verbose_name="CourseName")感谢GirlSniper'spythonDjangoreverseaccessor'sforeignkeyconflictresolution4.如何添加related_name属性到外键并自定义关联名称?related_name='primarykeyfield'感谢mmaotai的related_name面函数5.外键删除常用属性介绍CASCADE:这是默认选项,级联删除,不需要显式指定。保护:保护模式。如果使用该选项,删除时会抛出ProtectedError错误。SET_NULL:空白模式。删除时,外键字段设置为空。前提是blank=True,null=True。定义该字段时,允许为空。SET_DEFAULT:设置默认值。删除时,外键字段设置为默认值,所以在定义外键时注意添加默认值。SET():自定义一个值,应该值当然只能是对应的实体了鸣谢lucky__peng的django中on_delete6、数据迁移中的常见错误汇总6.1ERRORS:auth.User.groups:(fieldsRe.E30)'User.groups'与'UserProfile.groups'的反向访问器冲突。提示:将related_name参数添加或更改为'User.groups'或'UserProfile.groups'的定义。auth.User.user_permissions:(fields.E304)'User.user_permissions'的反向访问器与'UserProfile.user_permissions'的反向访问器冲突。提示:添加或更改related_name参数到'User.user_permissions'或'UserProfile.user_permissions'.users.UserProfile.groups的定义:(fields.E304)'UserProfile.groups'的反向访问器与'User.groups'的反向访问器冲突。提示:添加或更改related_name参数到'UserProfile.groups'或'User.groups'.users的定义。UserProfile.user_permissions:(fields.E304)“UserProfile.user_permissions”的反向访问器与“User.u”的反向访问器冲突ser_permissions'.HINT:为'UserProfile.user_permissions'或'User.user_permissions'用户认证模型类数据迁移错误的定义添加或更改一个related_name参数,错误原因:继承了AbstractUser类,未在设置文件中声明自定义类用户解决方案:在配置文件settings中声明使用自定义User类:#指定使用自定义模型类:AUTH_USER_MODEL='users.User'#users是应用的名字,User是模型的名字班级。感谢571428对于python用户认证模型类数据迁移错误6.2字段admin.LogEntry.user声明为对'user.user'的惰性引用,但应用'user'不提供模型'user'。翻译是用户应用程序“用户”不提供模型“用户”。解决方法:1、先删除迁移的文件。2、然后删除配置好的数据库,重新创建。3.重新创建后迁移。感谢菜鸟早期成长django执行迁移文件报错userapplication'user'doesnotprovidemodel'user'6.3Migrationadmin.0001_initialisapplyedbeforeitsdependencyusers。出现这个问题的原因是之前执行了runmanage.py任务:migrate,然后再次执行:migrateusers#users是app名称,解决方法是删除数据库中的所有表,删除migrations应用程序下的文件夹,然后执行:makemigrationsusers,migrateusersthanksgeerniya'sDjangoError-Migrationadmin.0001_initialisappliedbeforeitsdependencyusers.6.4raiseFieldDoesNotExist("%shasnofieldnamed'%s'"%(self.object_name,field_name))django.core.exceptions.FieldDoesNotExist:CourseOrg没有名为“name”的字段实际上只是因为您还没有更改adminx文件。解决方法如下:删除XXAdmin类中不存在的字段。特别注意adminx.py中的文件,在后台显示可选选项。修改models.py文件后,还必须修改adminx.py文件。感谢django的raiseFieldDoesNotExist('%shasnofieldnamed%r'%(self.object_name,field_name))7.编程过程中遇到的一些问题和感知MySQLdb._exceptions.ProgrammingError:(1146,"Table'mxonline.django_content_type'doesn'texist")遇到这个特殊问题,问度娘无果后,仔细看了教程,发现需要清空migrations.py文件夹下除了__init__.py和MySQL数据库以外的所有文件表后,再次进行迁移。反复失败后,终于知道,经过前面的操作,应该先迁移最底层大家可以调用的users表,其他表按常规迁移。最后得出机构表是主键表,课程表是外键表。机构表需要为课程表提供外键。设置完成后,机构表写一个导入课程表的函数,并在views中写获取逻辑(将CourseOrg作为对象传递),配置url,交给setting,在html中显示文件。领悟,就是了解问题的来龙去脉,一一分解。一些复杂的问题需要分解。毕竟现在不是人工智能强盛的时代,搜索引擎也不够“聪明”。遇到不熟悉的知识点,要学会积极补充。背景知识。最后,认真想想。
