天天看点

Python学习---Model拾遗[1]180318

Python学习---Model拾遗[1]180318

Model: 强大的数据库操作,弱小的数据验证

Form:  强大的数据验证

ModelForm: 强大的数据验证 + 弱小的数据库操作

Python学习---Model拾遗[1]180318
1. 创建数据库表 2. 修改表级别和行级别的数据     2.1 数据表操作         1.代码优先【Code First】:       创建类 --> 自动生成表 【Django】         2.数据库优先【DataBase First】: 创建表 --> 自动生成类 【Hibernate&Mybatit】             单  表:             一对一:             一对多:只能ForeignKey, 有约束关系                 注:一对多在多的一方创建ForeignKey[从sql角度看清楚]             多对多:1. Django帮我们创建第三张表                         models.ManyToManyField   -->类中不添加任何字段,只是帮我们创建第三张表                     2. 我们自己创建第三张表【推荐】                         1. 创建一个类,定义2个外键,此时表关系一目了然                     3. 我们自己创建第三张表,且让Django来引用                 注:多对多只涉及正反查找问题,写在任意一个类即可                     利用ManyToManyField创建第三张表的时候,DJangoAdmin里面添加内容是会有该字段内容                     自定义的第三张表需要添加Favor类到admin里才能显示                        2.2 数据行操作

使用Django帮我们创建第三张表效果:

settings.py

urls.py

views.py

models.py

app01/admin.py

页面显示;

Python学习---Model拾遗[1]180318

初始化数据库和admin用户

使用自定义的第三张表Favor的效果:

页面显示:

Python学习---Model拾遗[1]180318

使用many2many + 自定义的第三张表:

更改了表单,需要重新写入数据库

注意:

1.因为我们使用的through_field()对Favor的部分字段进行关联,并未关联全部,所以页面是无法直接添加数据的。

2.我们使用through对自定义的Favor和News进行关联后,是不能直接使用add(),remove()的操作方法的,

但是可以利用all(),filter()进行查找操作。同时obj.favor.clear()也是可以用的...

Python学习---Model拾遗[1]180318

初始化数据库

问题解决:

问题现象:

Python学习---Model拾遗[1]180318

问题定位:

    Django帮创建了多对多的News.Favor和我们自定义的class Favor,此时2个是一个功能,所以系统提示我们查询的时候名称冲突了,添加一个查询别名即可解决。

Python学习---Model拾遗[1]180318

一对一操作:表和表的关联

2种方法:

userProfile = models.ForeignKey("UserProfile", on_delete=True, unique=True) # 唯一索引       userDetail = models.OneToOneField("UserProfile", on_delete=True)  # 一对一的另一种写法

注:如果我们遇到了一个有很多列的表单时,可以拆分关键独立一个表单,然后利用表和表之间一对一的关系进行关联,可以减少sql查询时候的时间

Models.py