Django-外键和表的关系以及数据如何添加(一对多)

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()

你可能感兴趣的:(django,mysql,数据库,django,python,后端,sql,mysql)