Django ORM 常用字段和参数

目录

  • Django ORM 常用字段和参数
    • models中的常用字段
    • 如何自定义char类型字段
    • 字段内的关键字参性参数
      • DateField和DateTimeField
    • 关系字段
      • ForeignKey
    • 字段参数
    • OneToOneField
    • choices参数
      • 用户表举例:
      • 基本运用
    • 数据库查询优化(面试会问)
      • only与defer的用法:
      • defer的使用:
      • selected_related与prefetch_related的用法
      • selected_related与prefetch_related的优缺点:
    • django orm如何开启事务操作
      • 事务的四大特性(ACID)
      • 数据库的三大设计范式
    • django orm开启事务操作
      • 导入模块:
    • MTV与MVC模型
      • MTV: django号称是MTV框架
      • MVC
      • 本质
      • BMS:

Django ORM 常用字段和参数

models中的常用字段

AutoField(primary_key=True)  主键字段
CharField(max_length=32)     varchar(32)
IntegerField()               int
BigIntergerField()           bigint
DecimalField()               decimal
EmailField()                 varchart(254)
DateField()                  date
DateTimeField()              datetime
auto_now:每次编辑数据的时候都会自动更新该字段时间
    auto_now_add:创建数据的时候自动更新 
        BooleanField(Field)
        给该字段传布尔值 会对应成  数字0/1
        is_delete
        is_status
        is_vip
        TextField(Field)
        - 文本类型
        存储大段文本
        FileField(Field)
        - 字符串,路径保存在数据库,文件上传到指定目录,只存文件路径
        upload_to = '指定文件路径'
        给该字段传文件对象 文件会自动保存到upload_to指定的文件夹下 然后该字段存文件的路径
AutoField
AutoField(primary_key=True)  主键字段
int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列。
CharField
CharField(max_length=32)     varchar(32)
字符类型,必须提供max_length参数, max_length表示字符长度。

这里需要知道的是Django中的CharField对应的MySQL数据库中的varchar类型,没有设置对应char类型的字段,但是Django允许我们自定义新的字段,下面我来自定义对应于数据库的char类型

img

自定义字段在实际项目应用中可能会经常用到,这里需要对他留个印象

from django.db import models

# Create your models here.
#Django中没有对应的char类型字段,但是我们可以自己创建
class FixCharField(models.Field):
    '''
    自定义的char类型的字段类
    '''
    def __init__(self,max_length,*args,**kwargs):
        self.max_length=max_length
        super().__init__(max_length=max_length,*args,**kwargs)

    def db_type(self, connection):
        '''
        限定生成的数据库表字段类型char,长度为max_length指定的值
        :param connection:
        :return:
        '''
        return 'char(%s)'%self.max_length
#应用上面自定义的char类型
class Class(models.Model):
    id=models.AutoField(primary_key=True)
    title=models.CharField(max_length=32)
    class_name=FixCharField(max_length=16)
    gender_choice=((1,'男'),(2,'女'),(3,'保密'))
    gender=models.SmallIntegerField(choices=gender_choice,default=3)
IntegerField
IntegerField()               int
一个整数类型,范围在 -2147483648 to 2147483647。(一般不用它来存手机号(位数也不够),直接用字符串存,)
BigIntergerField
BigIntergerField()           bigint
长整型(有符号的) -9223372036854775808 ~ 9223372036854775807
DecimalField
DecimalField()               decimal
- 10进制小数
- 参数:
max_digits,小数总长度
decimal_places,小数位长度
EmailField
EmailField()                 varchart(254)
字符串类型,Django Admin以及ModelForm中提供验证机制
DateField
DateField()                  date
日期格式      YYYY-MM-DD
DateTimeField
DateTimeField()              datetime
auto_now:每次编辑数据的时候都会自动更新该字段时间
    auto_now_add:创建数据的时候自动更新
        
日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例。
BooleanField
BooleanField(Field)
BooleanField(Field)
给该字段传布尔值 会对应成  数字0/1
    is_delete
    is_status
    is_vip
TextField
TextField(Field)
- 文本类型
存储大段文本
FileField
FileField(Field)
- 字符串,路径保存在数据库,文件上传到指定目录,只存文件路径
upload_to = '指定文件路径'
给该字段传文件对象 文件会自动保存到upload_to指定的文件夹下 然后该字段存文件的路径

如何自定义char类型字段

from django.db.models import Field


class RealCharField(Field):
    def __init__(self,max_length,*args,**kwargs):
        self.max_length = max_length  # 拦截一个父类的方法 操作完之后 利用super调用父类的方法
        super().__init__(max_length=max_length,*args,**kwargs)


        def db_type(self, connection):
            return 'char(%s)'%self.max_length

        class Movie(models.Model):
            textField = RealCharField(max_length=64)

img

效果:

Django ORM 常用字段和参数_第1张图片

字段内的关键字参性参数

null
default

django 1.x默认就是级联更新级联删除  django2.x需要你自己手动指定
    on_delete = models.CASCADE
    db_contraints = True
# 百度
null
用于表示某个字段可以为空。
unique
如果设置为unique=True 则该字段在此表中必须是唯一的 。
db_index
如果db_index=True 则代表着为此字段设置索引。
default
为该字段设置默认值。

DateField和DateTimeField

auto_now_add
配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。
auto_now
配置上auto_now=True,每次更新数据记录的时候会更新该字段。

关系字段

ForeignKey

外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在 '一对多'中'多'的一方。

ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系。

字段参数

to
设置要关联的表
to_field
设置要关联的表的字段
on_delete
当删除关联表中的数据时,当前表与其关联的行的行为。
models.CASCADE
删除关联数据,与之关联也删除
db_constraint
是否在数据库中创建外键约束,默认为True。

代码演示:

def func():
    return 10

class MyModel(models.Model):
    user = models.ForeignKey(
        to="User",
        to_field="id",
        on_delete=models.SET(func)
    )

OneToOneField

to
设置要关联的表。
to_field
设置要关联的字段。
on_delete
当删除关联表中的数据时,当前表与其关联的行的行为。(参考上面的例子)

choices参数

用户表举例:

用户的性别
学历
婚否
在职状态
客户来源
当你的数据能够被你列举完全  你就可以考虑使用choices参数

基本运用

代码:列一

# choices字段
class Userinfo(models.Model):
    username = models.CharField(max_length=32)
    gender_choices = (
        (1,'男'),
        (2,'女'),
        (3,'其他'),
    )
    gender = models.IntegerField(choices=gender_choices)
    # 该字段还是存数字 并且可以匹配关系之外的数字
咧二
record_choices = (('checked', "已签到"),
                  ('vacate', "请假"),
                  ('late', "迟到"),
                  ('noshow', "缺勤"),
                  ('leave_early', "早退"),
                 )
record = models.CharField("上课纪录", choices=record_choices, default="checked", max_length=64)

两个列子一样的用法:如下

效果:

Django ORM 常用字段和参数_第2张图片

向表中添加数据:

先存数据
models.Userinfo.objects.create(username='jason',gender=1)
models.Userinfo.objects.create(username='tank',gender=2)
models.Userinfo.objects.create(username='egon',gender=3)
models.Userinfo.objects.create(username='sean',gender=10)

效果:

Django ORM 常用字段和参数_第3张图片

获取值:

    user_obj = models.Userinfo.objects.get(pk=1)
    print(user_obj.username)
    print(user_obj.gender)
    # 针对choices参数字段 取值的时候   get_xxx_display()
    print(user_obj.get_gender_display())
    
    
    # # 针对没有注释信息的数据  get_xxx_display()获取到的还是数字本身
    user_obj = models.Userinfo.objects.get(pk=4)
    print(user_obj.gender)
    print(user_obj.get_gender_display())

    user_obj = models.Userinfo.objects.get(pk=1)
    print(user_obj.username)
    print(user_obj.gender)
    # 针对choices参数字段 取值的时候   get_xxx_display()
    print(user_obj.get_gender_display())

效果:

Django ORM 常用字段和参数_第4张图片

针对没有(pk=4)数据的值

    # # 针对没有注释信息的数据  get_xxx_display()获取到的还是数字本身
    user_obj = models.Userinfo.objects.get(pk=4)
    print(user_obj.gender)
    print(user_obj.get_gender_display())

效果:

Django ORM 常用字段和参数_第5张图片

数据库查询优化(面试会问)

only与defer


selected_related与prefetch_related

惰性查询:

django orm查询都是惰性查询
res = models.Book.objects.all()  # django orm查询都是惰性查询
#没有用到res变量名 ,就是惰性查询。
反之:
print(res)

效果:

Django ORM 常用字段和参数_第6张图片

反之:

Django ORM 常用字段和参数_第7张图片

only与defer的用法:

noly的使用:
res = models.Book.objects.only('title')  # 這些對象内部只有title屬性
# print(res)
for r in res:
    # print(r.title)
    print(r.price)
# res = models.Book.objects.only('title')  # 這些對象内部只有title屬性    存有惰性查询的意思。
# print(res)

效果:

Django ORM 常用字段和参数_第8张图片

效果:print(r.title)

效果:print(r.price) 走数据库

Django ORM 常用字段和参数_第9张图片

only作用
only作用
括号内传字段 得到的结果是一个列表套数据对象 该对象内只含有括号内指定的字段属性

对象点该字段属性是不会走数据库的 但是你一旦点了非括号内的字段 也能够拿到数据,但是是重新走的数据库查询吧

defer的使用:

res = models.Book.objects.defer('title')  # defer与only互为反关系
print(res)

效果:

Django ORM 常用字段和参数_第10张图片

res = models.Book.objects.defer('title')  # defer与only互为反关系  r点其他数据就不走数据库,就是说除了title数据外其他数据都有,如点title,就会重新走一遍数据库
for r in res:
    print(r.title)

效果:r点其他数据,就是说除了title数据外其他数据都有,如点title,就会重新走一遍数据库

Django ORM 常用字段和参数_第11张图片

defer作用:
defer与only相反
括号内传字段 得到的结果是一个列表套数据对象 该对象内没有括号内指定的字段属性
对象点该字段属性会重复走数据库 但是你一旦点了非括号内的字段 就不走数据库了

selected_related与prefetch_related的用法

引子:

    # res = models.Book.objects.get(pk=1)
    # print(res.publish.name)

效果:

Django ORM 常用字段和参数_第12张图片

selected_related:

res = models.Book.objects.select_related('publish')
print(res)

效果:

Django ORM 常用字段和参数_第13张图片

# res = models.Book.objects.select_related('authors')
# for r in res:
#     print(r.publish.name)
#     print(r.publish.addr)

效果:存放多对多字段报错

效果:不放多对多字段:

Django ORM 常用字段和参数_第14张图片

selected_related作用
    内部是连表操作 现将关系表全部链接起来 之后再一次性查询出来 封装到对象中
    数据对象之后在获取任意表中的数据的时候都不需要再走数据库了 因为全部封装成了对象的属性
    
    select_related括号内只能传外键字段 并且不能是多对多字段 只能是一对多和一对一
    select_related(外键字段1__外键字段2__外键字段3...)
prefetch_related的使用:
res = models.Book.objects.prefetch_related('publish')
print(res)

效果:

Django ORM 常用字段和参数_第15张图片

for循环:

   res = models.Book.objects.prefetch_related('publish')
   for r in res:
   print(r.publish.name)

效果:

Django ORM 常用字段和参数_第16张图片

prefetch_related的作用
prefetch_related内部是子查询 但是给你的感觉是连表操作
内部通过子查询将外键管理表中的数据页全部给你封装到对象中
之后对象点当前表或者外键关联表中的字段也都不需要走数据库了

selected_related与prefetch_related的优缺点:

优点:select_related连表操作 好处在于只走一次sql查询
缺点:耗时耗在 连接表的操作  10s

:prefetch_related子查询  走两次sql查询
耗时耗在 查询次数      1s

django orm如何开启事务操作

事务的四大特性(ACID)

原子性:

原子性(Atomicity),原子意为最小的粒子,即不能再分的事务,要么全部执行,要么全部取消(就像上面的银行例子)

一致性:

一致性(Consistency):指事务发生前和发生后,数据的总额依然匹配

隔离性:

隔离性(Isolation):简单点说,某个事务的操作对其他事务不可见的

持久性:

 持久性(Durability):当事务完成后,其影响应该保留下来,不能撤消,只能通过“补偿性事务”来抵消之前的错误
                start transaction
                rollback
                commit

数据库的三大设计范式

第一范式:当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式规范化的最低要

求,否则,将有很多基本操作在这样的关系模式中实现不了。

第二范式:如果关系模式R满足第一范式,并且R得所有非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式,简记为2NF。

第三范式:设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,简记为3NF.

注:关系实质上是一张二维表,其中每一行是一个元组,每一列是一个属性

django orm开启事务操作

导入模块:

from django.db import transaction
# django orm开启事务操作
from django.db import transaction
with transaction.atomic():
    # 在with代码块中执行的orm语句同属于一个事务
    pass

# 代码块运行结束 事务就结束了  事务相关的其他配置 你可以百度搜搜看

MTV与MVC模型

MTV: django号称是MTV框架

M  指:models
T   :templates
V   :views

MVC

M:models
    V:views
        C:contronnar  控制器(路由分发 urls.py)

本质

本质:MTV本质也是MVC

BMS:

Web领域没有绝对的安全 也没有绝对的不安全

你可能感兴趣的:(Django ORM 常用字段和参数)