Python学习---Model拾遗[1]180318
Model: 强大的数据库操作,弱小的数据验证
Form: 强大的数据验证
ModelForm: 强大的数据验证 + 弱小的数据库操作
Model拾遗
Model基本操作
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
- INSTALLED_APPS = [
- ...
- 'app01', # 注册app
- ]
- STATICFILES_DIRS = (os.path.join(BASE_DIR, "statics"),) # 现添加的配置,这里是元组,注意逗号
- TEMPLATES = [
- ...
- 'DIRS': [os.path.join(BASE_DIR, 'templates')],
- ]
urls.py
- from django.contrib import admin
- from django.urls import path
- from django.conf.urls import url, include
- from app01 import views
- urlpatterns = [
- ]
views.py
- from django.shortcuts import render, redirect, HttpResponse
- from app01 import models
models.py
- from django.db import models
- class User(models.Model):
- id = models.AutoField(primary_key=True) # AutoField必须是主键,才能自定义该列
- name = models.CharField(max_length=32)
- userType = models.ForeignKey("UserType", on_delete=True)# 1对多[无法用自定义,有约束关系]
- # 多对多[1. 自己创建第三张表 2. manytomany ]
- # 在DjangoAdmin里面如果自己创建第三张表,则DjangoAdmin里面不会有下拉框
- # ManytoMany创建约束后,DjangoAdmin里面会有下拉框[因为DjangoAdmin使用的是ModelForm,它会将此作为一个字段显示]
- class UserType(models.Model):
- name = models.CharField(max_length=32)
- class News(models.Model):
- title = models.CharField(max_length=32)
- # Django帮我们创建第三张表favor
- favor = models.ManyToManyField("User") # DjangoAdmin里面显示2个字段[title + favor多选框]
- # 自定义的第三张表,该示例中引用的是many2many创建第三张表【admin中未注册该类】
- class Favor(models.Model):
- new = models.ForeignKey("News", on_delete=True, related_name='u')
- user = models.ForeignKey("User", on_delete=True, related_name='n')
app01/admin.py
- from django.contrib import admin
- # Register your models here.
- from app01 import models
- admin.site.register(models.User)
- admin.site.register(models.News)
- admin.site.register(models.UserType)
页面显示;
初始化数据库和admin用户
- python manage.py makemigrations
- python manage.py migrate
- python manage.py createsuperuser
使用自定义的第三张表Favor的效果:
models.py
- from django.db import models
- class User(models.Model):
- id = models.AutoField(primary_key=True) # AutoField必须是主键,才能自定义该列
- name = models.CharField(max_length=32)
- userType = models.ForeignKey("UserType", on_delete=True)# 1对多[无法用自定义,有约束关系]
- # 多对多[1. 自己创建第三张表 2. manytomany ]
- # 在DjangoAdmin里面如果自己创建第三张表,则DjangoAdmin里面不会有下拉框
- # ManytoMany创建约束后,DjangoAdmin里面会有下拉框[因为DjangoAdmin使用的是ModelForm,它会将此作为一个字段显示]
- class UserType(models.Model):
- name = models.CharField(max_length=32)
- class News(models.Model):
- title = models.CharField(max_length=32)
- # Django帮我们创建第三张表favor【这里不引用它】
- # favor = models.ManyToManyField("User")
- # 自定义的第三张表,【admin中注册该类,引用自定义表】
- class Favor(models.Model):
- new = models.ForeignKey("News", on_delete=True, related_name='u')
- user = models.ForeignKey("User", on_delete=True, related_name='n')
app01/admin.py
- from django.contrib import admin
- # Register your models here.
- from app01 import models
- admin.site.register(models.User)
- admin.site.register(models.News)
- admin.site.register(models.UserType)
- admin.site.register(models.Favor)
页面显示:
使用many2many + 自定义的第三张表:
更改了表单,需要重新写入数据库
注意:
1.因为我们使用的through_field()对Favor的部分字段进行关联,并未关联全部,所以页面是无法直接添加数据的。
2.我们使用through对自定义的Favor和News进行关联后,是不能直接使用add(),remove()的操作方法的,
但是可以利用all(),filter()进行查找操作。同时obj.favor.clear()也是可以用的...
models.py
- from django.db import models
- class User(models.Model):
- id = models.AutoField(primary_key=True) # AutoField必须是主键,才能自定义该列
- name = models.CharField(max_length=32)
- userType = models.ForeignKey("UserType", on_delete=True)# 1对多[无法用自定义,有约束关系]
- # 多对多[1. 自己创建第三张表 2. manytomany ]
- # 在DjangoAdmin里面如果自己创建第三张表,则DjangoAdmin里面不会有下拉框
- # ManytoMany创建约束后,DjangoAdmin里面会有下拉框[因为DjangoAdmin使用的是ModelForm,它会将此作为一个字段显示]
- class UserType(models.Model):
- name = models.CharField(max_length=32)
- class News(models.Model):
- title = models.CharField(max_length=32)
- # Django帮我们创建第三张表且指向我们自定义的Favor表并添加指定的字段
- favor = models.ManyToManyField("User", through='Favor', through_fields=('new_obj', 'user_obj'))
- # 自定义的第三张表,【admin中注册该类,引用自定义表】
- class Favor(models.Model):
- new1 = models.ForeignKey("News", on_delete=True, related_name='u1') # 不引用该字段
- New_obj = models.ForeignKey("News", on_delete=True, related_name='u')
- user_obj = models.ForeignKey("User", on_delete=True, related_name='n')
app01/admin.py
- from django.contrib import admin
- # Register your models here.
- from app01 import models
- admin.site.register(models.User)
- admin.site.register(models.News)
- admin.site.register(models.UserType)
- admin.site.register(models.Favor)
页面显示:
初始化数据库
- python manage.py makemigrations
- python manage.py migrate
问题解决:
问题现象:
问题定位:
Django帮创建了多对多的News.Favor和我们自定义的class Favor,此时2个是一个功能,所以系统提示我们查询的时候名称冲突了,添加一个查询别名即可解决。
一对一操作:表和表的关联
2种方法:
userProfile = models.ForeignKey("UserProfile", on_delete=True, unique=True) # 唯一索引
userDetail = models.OneToOneField("UserProfile", on_delete=True) # 一对一的另一种写法
注:如果我们遇到了一个有很多列的表单时,可以拆分关键独立一个表单,然后利用表和表之间一对一的关系进行关联,可以减少sql查询时候的时间
Models.py
- from django.db import models
- class User(models.Model):
- id = models.AutoField(primary_key=True) # AutoField必须是主键,才能自定义该列
- name = models.CharField(max_length=32)
- userType = models.ForeignKey("UserType", on_delete=True) # 1对多[无法用自定义,有约束关系]
- userProfile = models.ForeignKey("UserProfile", on_delete=True, unique=True) # 一对一,唯一索引
- userDetail = models.OneToOneField("UserProfile", on_delete=True) # 一对一的另一种写法
- # Sql优化: 长度固定的字段放在最前面
- class UserProfile(models.Model):
- pwd = models.CharField(max_length=32)
更多参考:
Model操作;:http://www.cnblogs.com/wupeiqi/articles/6216618.html
Form操作; :http://www.cnblogs.com/wupeiqi/articles/6144178.html
Model操作;:http://www.cnblogs.com/wupeiqi/articles/6229414.html
Python学习---Model拾遗[1]180318的更多相关文章
- Python学习---Model拾遗[2]180318
Model的字段及字段参数: Model字段: 数字 字符串(带正则的字段) 时间 文件 特殊字段:(一对一,一对多,多对多) Models.py ...
- Python学习---ModelForm拾遗180325
ModelForm适用于前台验证和后台直接操作数据库的前后台未做分离,可以一次执行验证和保存数据的场景. 注意: 1. ModelForm里面没有删除方法,需要手动删除内容 2. ModelFor ...
- Python学习---Form拾遗180322
Form操作之错误信息操作 1. 用户发送请求过来 2. for 循环对字段进行正则表达式的验证 fields.clean(value) 3. 自定义clean_字段() 进行名字段值正确性的校验 ...
- Python学习---Django拾遗180328
Django之生命周期 前台发送URL请求到Django的中间件进行内容校验,完成校验后到达路由映射文件url.py,然后调用视图函数views.py里面的函数进行内容处理[ 1.操作数据库进行数据读 ...
- python学习笔记--Django入门四 管理站点--二
接上一节 python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...
- Python学习懒出极致——自备常用链接
linux: samba配置:http://blog.chinaunix.net/uid-23069658-id-3142052.html ubuntu: mysql启停:http://www.2ct ...
- 【python学习笔记】10.充电时刻
[python学习笔记]10.充电时刻 任何python都可以作为模块倒入 *.pyc:平台无关的经过编译的的python文件, 模块在第一次导入到程序中时被执行,包括定义类,函数,变量,执行语句 可 ...
- Python学习计划
---恢复内容开始--- Python学习计划 https://edu.csdn.net/topic/python2?utm_source=blog4 匠人之心,成就真正Python全栈工程师 ...
- python学习博客地址集合。。。
python学习博客地址集合... 老师讲课博客目录 http://www.bootcdn.cn/bootstrap/ bootstrap cdn在线地址 http://www.cnblogs. ...
随机推荐
- 全网最全的Windows下Anaconda2 / Anaconda3里正确下载安装Theano(图文详解)
不多说,直接上干货! Theano的安装教程目前网上一搜很多,前几天折腾了好久,终于安装成功了Anaconda3(Python3)的Theano,嗯~发博客总结并分享下经验教训吧. 渣电脑,显卡用的是 ...
- java多线程---------java.util.concurrent并发包----------ThreadPoolExecutor
ThreadPoolExecutor线程池 一.三个构造方法 ThreadPoolExecutor(int corePoolSize,int MaxmumPoolSize,long KeepAlive ...
- mock时忽略不必要的初始化
PowerMockito.mockStatic时忽略加载类的静态field,比如想PowerMockito.mockStatic(ClassA.class),ClassA如下 public class ...
- js处理json数据,java处理json数据
一.js处理json数据 处理办法之一是把本机json数据或远程返回json数据用eval函数,使之变成DOM对象. 例如: var people = { "programmers" ...
- 【LeetCode题解】350_两个数组的交集Ⅱ
目录 [LeetCode题解]350_两个数组的交集Ⅱ 描述 方法一:映射 Java 实现 Python 实现 类似的 Python 实现 方法二:双指针 Java 实现 Python 实现 [Lee ...
- 每天一道leetcode234-回文链表
考试结束,班级平均分只拿到了年级第二,班主任于是问道:大家都知道世界第一高峰珠穆朗玛峰,有人知道世界第二高峰是什么吗?正当班主任要继续发话,只听到角落默默想起来一个声音:”乔戈里峰” 前言 2018. ...
- [PHP] 试题系统研究
考试科目: 添加考试科目,填写科目名称,选择科目题型(复选框/单选题,多选题,判断题,问答题,填空题) 添加科目章节,填写章节名称,添加章节知识点,填写知识点以英文逗号分隔,直接插入多条记录 开通考场 ...
- 撩课-Python-每天5道面试题-第2天
一. 简述编程过程中, 注释的作用? (1) 方便开发人员自己理清楚代码思路 因为开发人员在拿到一个需求时, 首先应该思考的是如何将需求问题, 分解成具体的实施步骤; 第一步干啥, 第二步干啥, 第三 ...
- EF框架CodeFirst the model backing the 'PModelEntities' context has changed since the database was created. Consider using Code First Migrations to update the database
1.采用code first 做项目时,数据库已经生成,后期修改数据库表结构.再次运行时出现一下问题: Entity Framework : The model backing the 'Produc ...
- WinFrom柱形图
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...