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的更多相关文章

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

    Model的字段及字段参数: Model字段: 数字        字符串(带正则的字段)        时间        文件       特殊字段:(一对一,一对多,多对多) Models.py ...

  2. Python学习---ModelForm拾遗180325

    ModelForm适用于前台验证和后台直接操作数据库的前后台未做分离,可以一次执行验证和保存数据的场景. 注意:  1.  ModelForm里面没有删除方法,需要手动删除内容 2. ModelFor ...

  3. Python学习---Form拾遗180322

    Form操作之错误信息操作 1. 用户发送请求过来 2. for 循环对字段进行正则表达式的验证  fields.clean(value) 3. 自定义clean_字段() 进行名字段值正确性的校验 ...

  4. Python学习---Django拾遗180328

    Django之生命周期 前台发送URL请求到Django的中间件进行内容校验,完成校验后到达路由映射文件url.py,然后调用视图函数views.py里面的函数进行内容处理[ 1.操作数据库进行数据读 ...

  5. python学习笔记--Django入门四 管理站点--二

    接上一节  python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...

  6. Python学习懒出极致——自备常用链接

    linux: samba配置:http://blog.chinaunix.net/uid-23069658-id-3142052.html ubuntu: mysql启停:http://www.2ct ...

  7. 【python学习笔记】10.充电时刻

    [python学习笔记]10.充电时刻 任何python都可以作为模块倒入 *.pyc:平台无关的经过编译的的python文件, 模块在第一次导入到程序中时被执行,包括定义类,函数,变量,执行语句 可 ...

  8. Python学习计划

    ---恢复内容开始--- Python学习计划   https://edu.csdn.net/topic/python2?utm_source=blog4   匠人之心,成就真正Python全栈工程师 ...

  9. python学习博客地址集合。。。

    python学习博客地址集合...   老师讲课博客目录 http://www.bootcdn.cn/bootstrap/  bootstrap cdn在线地址 http://www.cnblogs. ...

随机推荐

  1. ok6410 android driver(1)

    target system : Android (OK6410) host system : Debian Wheezy AMD64 1.Set up android system in ok6410 ...

  2. 利用OC对象的消息重定向forwardingTargetForSelector方法构建高扩展性的滤镜功能

    在OC中,当像一个对象发送消息,而对象找到消息后,从它的类方法列表,父类方法列表,一直找到根类方法列表都没有找到与这个选择子对应的函数指针.那么这个对象就会触发消息转发机制. OC对象的继承链和isa ...

  3. pythonchallenge(七)

    转眼间又一个月没有逛博客园,明显的感觉到自己的代码能力变弱,前两周搞项目去了,只是形式上面的答辩而已,并没有涉及到代码层面,也就玩了一下验证码,没有识别玩出校器网页的验证码:转眼间又是各种考试,所幸, ...

  4. Java如何操作对象(bean)进行动态排序?

    原文出自:https://blog.csdn.net/seesun2012 简介如题:Java如何操作对象(bean)进行动态排序?Java实体类(bean)动态排序? 原理:利用反射根据指定的属性值 ...

  5. unity GUI Layout 组件(全)

    [expand 扩张][fitter 装配工] [envelope 信封,包装] Layout 布局 三种.   Horizontal Layout Group 水平布局 Padding:内边距,单位 ...

  6. mysql:名次排名 (并列与不并列)

    http://www.cnblogs.com/zengguowang/p/5541431.html sql语句查询排名 思路:有点类似循环里面的自增一样,设置一个变量并赋予初始值,循环一次自增加1,从 ...

  7. 【SSH网上商城项目实战30】项目总结

      转自:https://blog.csdn.net/eson_15/article/details/51479994 0. 写在前面 项目基本完成了,加上这个总结,与这个项目相关的博客也写了30篇了 ...

  8. 转:zip 和 unzip 的参数说明

    收集的资料: 1. 我想把一个文件abc.txt和一个目录dir1压缩成为yasuo.zip: # zip -r yasuo.zip abc.txt dir1 2.我下载了一个yasuo.zip文件, ...

  9. thinkphp I() 方法

    I() 方法用于获取前台提交的表单的value值. <form id="complai_form" method="post" action=" ...

  10. <meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">的作用

    本人对该标签理解不深,这里是复制了穆乙的文章:如果有人进来看到这篇文章,请按此https://www.cnblogs.com/pigtail/archive/2013/03/15/2961631.ht ...