秒懂Django模型(数据库)关系(学习系列六)
Posted HUTEROX
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了秒懂Django模型(数据库)关系(学习系列六)相关的知识,希望对你有一定的参考价值。
前言
突然明白一个道理越是简短清晰的博客越受欢迎,然而清晰冗长的却也没几个人喜欢,一方面东西比较多,另一方面看着吓人。不过长的好处是方便查询和知识体系巩固,毕竟学习类的博客我都是写一个系列的,只是有没有上传整理的问题。不过既然如此那我就尽量简短每一篇博客吧,到后面再统一整理成超长篇幅,方便后期对知识体系进行回顾。
模板迁移
这个是老生常谈的问题,这里的话简单说一下坑点。
模板记录
很多朋友在对原有的表的结构进行修改的时候,肯定会直接把django原来生成的init文件删除然后重写,迁移写入。但是在写入的时候压根没有反应,你的数据库的表压根没动。这个原因其实就是因为,django当中的记录没有删掉。
这个表里面存放了大量的迁移记录,你只有把对应的迁移记录给删掉,那么系统才会重新给你迁移,然后写入数据库。
模型反射
我们前面的操作
python manage.py makemigrations
python manage.py migrate
都是将Model变成sql,那么现在就将sql变成Model,也就是把我们在数据库当中建好的表变到我们的django模型当中,这个也简单。
python maganer.py inspectdb > APP/models.py
这样就把这玩意搞到我们的模型文件中了
模型关系
这个其实就是我们以前学数据库的表之间的对应关系。
例如:一对一,一对多,多对多
一对多
这个玩烂了其实,也是最基础的,其他的关系其实都是通过它来建立的。在sql语句当中我们直接设置一个外键就好了,同样在django中也是这样的。
看代码:
class Grade(models.Model):
g_name = models.CharField(max_length=32)
class Student(models.Model):
s_name = models.CharField(max_length=16)
s_grade = models.ForeignKey(Grade) #添加外键约束
这个就是一个非常典型的一对多,谁多谁就添加外键,在djnago当中,这个外键参照的其实就是id,在django当中的模型会默认生成一个id,所有的关系默认都是通过id来进行绑定的。这个其实没什么好说的非常好理解就是班级和学生的关系,在学生表里面加一个字段用来保存班级的id,这个字段参照(reference Grade(id) )并且可以重复出现班级的id(多个学生在同一个班级),但是在一对多当中,假设(班级与学生一对一)那么在学生表中存储班级id的字段就不允许重复!
一对多
这个看我们上面的那个图其实已经很明显了。
那么在django当中这样表示就好了
class Person(models.Model):
p_name = models.CharField(max_length=32)
class Person_id(models.Model):
p_id = models.CharField(max_length=32)
p_person = models.OneToOne(Person)
现在用身份证和人的关系来做比喻
多对多
这个就要注意一点了,因为操作时不太一样的。
那么是怎么是实现的呢,我们还是先举个例子,购物车和人的关系,这个就是典型的多对多。
class Customer(model.Model):
c_name = models.CharField(max_length=16)
class Goods(models.Model):
g_name = models.CharField(max_length=16)
g_customer = models.MangToMangField(Customer)
现在我们把模型建好了,那么我们先对模型进行操作,后面我们再来说说这玩意是怎么做的。
获取查询部分还是和我们以前一样,但是这里多了一个添加关系,例如我们的购物车里面增加了一个商品。
Phone = Goods()
Phone.g_name="iPhone12"
Phone.save()
Me = Customer.objects.get(c_name="xiaoming")
Me.goods_set.add(Phone)
.remove(Phone)
.set(Phone1,Phone2,...)
当然我们也可以反过来,但是其实这些效果都是一样的,原因看下面的图你就明白了。
那么如果要自己实现的话也是这样开设计,甚至只会更加复杂。
主从表
每次涉及到这多表关系的时候就会出现联表关系的问题,在django当中凡是加了约束的例如人与身份证的那个关系中的身份证表就是从表,当主表删除时,从表也会删除(delete on cascade),这个是默认的,所以有时候为了数据安全,我们应该设置一下,例如只有当从表中对应的数据删了,那么主表才能被删除。
class Person_id(models.Model):
p_id = models.CharField(max_length=32)
p_person = models.OneToOne(Person,ondetele=models.PROTECT)
当然还有其他模式
SETNULL
SET_DEFAULT()
SET()
以上是关于秒懂Django模型(数据库)关系(学习系列六)的主要内容,如果未能解决你的问题,请参考以下文章