Django之数据库连表操作
Posted Captain
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django之数据库连表操作相关的知识,希望对你有一定的参考价值。
1、表结构修改
如果原来表中已存在的数据,表结构修改后就会出现结构混乱,makemigrations更新表的时候就会出错,解决方法:
1、新增加的字段,设置允许为空。生成表的时候,之前数据新增加的字段就会为空。(null=True允许数据库中为空,blank=True允许admin后台中为空)
2、新增加的字段,设置一个默认值。生成表的时候,之前的数据新增加字段就会应用这个默认值
图片、IP字段
ip = models.GenericIPAddressField(protocol="ipv4",null=True,blank=True) img = models.ImageField(null=True,blank=True,upload_to="upload")
settings文件配置url映射
数据中只是报错路径信息
2、常用参数
选择下拉框 choices
class UserInfo(models.Model): USER_TYPE_LIST = ((1,\'user\'),(2,\'admin\'),) user_type = models.IntegerField(choices=USER_TYPE_LIST,default=1)
3、连表结构
- 一对多:models.ForeignKey(其他表)
- 多对多:models.ManyToManyField(其他表)
- 一对一:models.OneToOneField(其他表)
应用场景: 一对多:当一张表中创建一行数据时,有一个单选的下拉框(可以被重复选择) 例如:创建用户信息时候,需要选择一个用户类型【普通用户】【金牌用户】【铂金用户】等。 多对多:在某表中创建一行数据是,有一个可以多选的下拉框 例如:创建用户信息,需要为用户指定多个爱好 一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了 例如:原有含10列数据的一张表保存相关信息,经过一段时间之后,10列无法满足需求,需要为原来的表再添加5列数据
一对多情况:
class Groupname(models.Model): caption = models.CharField(max_length=30) #不同的职务字段 class User(models.Model): username = models.CharField(max_length=30) password = models.CharField(null=False,max_length=30) email = models.EmailField(null=False) groupname = models.ForeignKey(Groupname) #外键
User表会自动添加groupname_id 的一个字段
多对多情况:
class UserGroup(models.Model): group_name = models.CharField(max_length=16) class User(models.Model): name = models.CharField(max_length=16) sex = models.CharField(max_length=16) email = models.EmailField(max_length=32) usergroup_user = models.ManyToManyField(\'UserGroup\')
Django model会自动创建第3张关系表,用于对应user id 和usergroup id
一对一情况:
class User2(models.Model): name = models.CharField(max_length=16) sex = models.CharField(max_length=16) email = models.EmailField(max_length=32) class Admin(models.Model): username = models.CharField(max_length=32) password = models.CharField(max_length=32) admin_user2 = models.OneToOneField(\'User2\')
获取GET参数数据,GET方式查询:
class Group2(models.Model): caption = models.CharField(max_length=32) class User2(models.Model): username = models.CharField(max_length=32) group2 = models.ForeignKey(\'Group2\')
一对多跨表操作,总结
1、group2对应的是一个对象
2、创建数据 group2_id ,直接查询数据库
3、获取数据,通过. group2.caption
4、查询数据,通过__ group2__caption
以上是关于Django之数据库连表操作的主要内容,如果未能解决你的问题,请参考以下文章
13.Django之数据库models&orm连表操作补充以及其他知识点补充