Django-外键和表的关系以及数据如何添加
一、首先来区分下什么是一对一,一对多以及多对多?
- 一对一:子表从母表中选出一条数据一一对应,母表中选出来一条就少一条,子表不可以再选择母表中已被选择的那条数据
- 一对多:子表从母表中选出一条数据一一对应,但母表的这条数据还可以被其他子表数据选择共同点是在admin中添加数据的话,都会出现一个select选框,但只能单选,因为不论一对一还是一对多,自己都是“一”
- 多对多总结:比如有多个孩子,和多种颜色、每个孩子可以喜欢多种颜色,一种颜色可以被多个孩子喜欢,对于双向均是可以有多个选择
二、应用场合:
一对一:一般用于某张表的补充,比如用户基本信息是一张表,但并非每一个用户都需要有登录的权限,不需要记录用户名和密码,此时,合理的做法就是新建一张记录登录信息的表,与用户信息进行一对一的关联,可以方便的从子表查询母表信息或反向查询
外键(一对多):有很多的应用场景,比如每个员工归属于一个部门,那么就可以让员工表的部门字段与部门表进行一对多关联,可以查询到一个员工归属于哪个部门,也可反向查出某一部门有哪些员工
多对多:如很多公司,一台服务器可能会有多种用途,归属于多个产品线当中,那么服务器与产品线之间就可以做成对多对,多对多在A表添加manytomany字段或者从B表添加,效果一致
三、一对多添加数据
models.py示例:
class Userinfo(models.Model):
"""用户的基本个人信息"""
open_id = models.CharField(max_length=100, verbose_name='openid', unique=True)
username = models.CharField(max_length=100, verbose_name='微信用户名称')
def __str__(self):
return self.open_id
class Meta:
verbose_name = '个人信息表'
verbose_name_plural = '个人信息表'
class Feedback(models.Model):
"""反馈建议表"""
feed_user = models.ForeignKey("Userinfo", on_delete=models.CASCADE, verbose_name='用户ID', null=True)
feed_text = models.TextField(verbose_name="反馈与建议", help_text="在这里填写反馈与建议")
isdelete = models.BooleanField(default=False)
class Meta:
verbose_name = '反馈与建议信息'
verbose_name_plural = '反馈与建议信息'
方式一:
使用的是create()方法
示例:
userinfo = Userinfo.objects.get(open_id=openid)
feed = Feedback.objects.create(feed_text='文本', feed_user=userinfo)
语法:
得到一方表的行对象
一方表行对象= 模型类.objects.get(pk=值)
多方表行对象 = 模型类.objects.create(字段 = 值,外键关联字段 = 一方表行对象)
注意点: create()方法不加save
方式二:
实例化方法直接赋值
示例:
userinfo = Userinfo.objects.get(open_id=openid)
one_link = Feedback(feed_text="文本")
one_link.userinfo = userinfo
one_link.save()
语法
1. 先得到一方表行对象
2.多方表行对象添加数据
3.外键关联的字段 直接使用 多行对象=一方对象,方式赋值
一方表行对象 = 模型类.objects.get(pk=值)
多方表行对象 = 模型类(字段=值)
多方表行对象.一方模型类名 = 一方表行对象
# 如果指定表名 就是使用表名
多方表行对象.save()
版权声明:本文为weixin_47774641原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。