Django ORM中常用字段和参数

Django ORM 常用字段和参数

常用字段

AutoField

int自增列,必须填入参数primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列。

IntegerField

一个整数类型,范围在 -2147483648 to 2147483647。(一般不用它来存手机号(位数也不够),直接用字符串存,)

CharField

字符类型,必须提供max_length参数, max_length表示字符长度。

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

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)

自定义及使用

DateField

日期字段,日期格式  YYYY-MM-DD,相当于Python中的datetime.date()实例。

DateTimeField

日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例。

字段合集

AutoField(Field)
        - int自增列,必须填入参数 primary_key=True

    BigAutoField(AutoField)
        - bigint自增列,必须填入参数 primary_key=True

        注:当model中如果没有自增列,则自动会创建一个列名为id的列
        from django.db import models

        class UserInfo(models.Model):
            # 自动创建一个列名为id的且为自增的整数列
            username = models.CharField(max_length=32)

        class Group(models.Model):
            # 自定义自增列
            nid = models.AutoField(primary_key=True)
            name = models.CharField(max_length=32)

    SmallIntegerField(IntegerField):
        - 小整数 -32768 ~ 32767

    PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
        - 正小整数 0 ~ 32767
    IntegerField(Field)
        - 整数列(有符号的) -2147483648 ~ 2147483647

    PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
        - 正整数 0 ~ 2147483647

    BigIntegerField(IntegerField):
        - 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807

    BooleanField(Field)
        - 布尔值类型

    NullBooleanField(Field):
        - 可以为空的布尔值

    CharField(Field)
        - 字符类型
        - 必须提供max_length参数, max_length表示字符长度

    TextField(Field)
        - 文本类型

    EmailField(CharField):
        - 字符串类型,Django Admin以及ModelForm中提供验证机制

    IPAddressField(Field)
        - 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制

    GenericIPAddressField(Field)
        - 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6
        - 参数:
            protocol,用于指定Ipv4或Ipv6, ‘both‘,"ipv4","ipv6"
            unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启此功能,需要protocol="both"

    URLField(CharField)
        - 字符串类型,Django Admin以及ModelForm中提供验证 URL

    SlugField(CharField)
        - 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号)

    CommaSeparatedIntegerField(CharField)
        - 字符串类型,格式必须为逗号分割的数字

    UUIDField(Field)
        - 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证

    FilePathField(Field)
        - 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能
        - 参数:
                path,                      文件夹路径
                match=None,                正则匹配
                recursive=False,           递归下面的文件夹
                allow_files=True,          允许文件
                allow_folders=False,       允许文件夹

    FileField(Field)
        - 字符串,路径保存在数据库,文件上传到指定目录
        - 参数:
            upload_to = ""      上传文件的保存路径
            storage = None      存储组件,默认django.core.files.storage.FileSystemStorage

    ImageField(FileField)
        - 字符串,路径保存在数据库,文件上传到指定目录
        - 参数:
            upload_to = ""      上传文件的保存路径
            storage = None      存储组件,默认django.core.files.storage.FileSystemStorage
            width_field=None,   上传图片的高度保存的数据库字段名(字符串)
            height_field=None   上传图片的宽度保存的数据库字段名(字符串)

    DateTimeField(DateField)
        - 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]

    DateField(DateTimeCheckMixin, Field)
        - 日期格式      YYYY-MM-DD

    TimeField(DateTimeCheckMixin, Field)
        - 时间格式      HH:MM[:ss[.uuuuuu]]

    DurationField(Field)
        - 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型

    FloatField(Field)
        - 浮点型

    DecimalField(Field)
        - 10进制小数
        - 参数:
            max_digits,小数总长度
            decimal_places,小数位长度

    BinaryField(Field)
        - 二进制类型

字段合集

对应关系:
    ‘AutoField‘: ‘integer AUTO_INCREMENT‘,
    ‘BigAutoField‘: ‘bigint AUTO_INCREMENT‘,
    ‘BinaryField‘: ‘longblob‘,
    ‘BooleanField‘: ‘bool‘,
    ‘CharField‘: ‘varchar(%(max_length)s)‘,
    ‘CommaSeparatedIntegerField‘: ‘varchar(%(max_length)s)‘,
    ‘DateField‘: ‘date‘,
    ‘DateTimeField‘: ‘datetime‘,
    ‘DecimalField‘: ‘numeric(%(max_digits)s, %(decimal_places)s)‘,
    ‘DurationField‘: ‘bigint‘,
    ‘FileField‘: ‘varchar(%(max_length)s)‘,
    ‘FilePathField‘: ‘varchar(%(max_length)s)‘,
    ‘FloatField‘: ‘double precision‘,
    ‘IntegerField‘: ‘integer‘,
    ‘BigIntegerField‘: ‘bigint‘,
    ‘IPAddressField‘: ‘char(15)‘,
    ‘GenericIPAddressField‘: ‘char(39)‘,
    ‘NullBooleanField‘: ‘bool‘,
    ‘OneToOneField‘: ‘integer‘,
    ‘PositiveIntegerField‘: ‘integer UNSIGNED‘,
    ‘PositiveSmallIntegerField‘: ‘smallint UNSIGNED‘,
    ‘SlugField‘: ‘varchar(%(max_length)s)‘,
    ‘SmallIntegerField‘: ‘smallint‘,
    ‘TextField‘: ‘longtext‘,
    ‘TimeField‘: ‘time‘,
    ‘UUIDField‘: ‘char(32)‘,

ORM字段与MySQL字段对应关系

字段参数

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。

外键字段
当你在使用django2.X版本的时候 在建立外键关系时(*****)
需要你手动添加几个关键点参数
models.cascade
db_constraints

models.DO_NOTHING
删除关联数据,引发错误IntegrityError

models.PROTECT
删除关联数据,引发错误ProtectedError

models.SET_NULL
删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)

models.SET_DEFAULT
删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)

models.SET

删除关联数据,
a. 与之关联的值设置为指定值,设置:models.SET(值)
b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)

其余字段参数

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

当删除关联表中的数据时,当前表与其关联的行的行为。(参考上面的例子)

一般操作

在进行一般操作时先配置一下参数,使得我们可以直接在Django页面中运行我们的测试脚本

在Python脚本中调用Django环境

这样就可以直接运行你的test.py文件来运行测试

数据的查询优化

only与defer

"""数据库查询优化"""

ORM内所有的语句操作  都是惰性查询:只会在你真正需要数据的时候才会走数据库,如果单单只写ORM语句是不会走数据库的

这样的设计可以减轻数据库的压力

only

# res = models.Book.objects.only(‘title‘)
# print(res)
# for r in res:
    print(r.title)  # 只走一次数据库查询
    print(r.price)  # 当你点击一个不是only括号内指定的字段的时候 不会报错 而是会频繁的走数据库查询

defer

res = models.Book.objects.defer(‘title‘)
for r in res:
    print(r.title)
    print(r.price)

defer与only是相反的
defer会将不是括号内的所有的字段信息 全部查询出来封装对象中
一旦你点击了括号内的字段 那么会频繁的走数据库查询

select_related和prefetch_related

# select_related与prefetch_related
# select_related帮你直接连表操作 查询数据   括号内只能放外键字段
# res = models.Book.objects.all().select_related(‘publish‘)
# for r in res:
    #print(r.publish.name)
#res=models.Book.objects.all().select_related(‘publish__xxx__yyy__ttt‘)
# print(res)
# res = models.Book.objects.all()
"""
select_related:会将括号内外键字段所关联的那张表  直接全部拿过来(可以一次性拿多张表)跟当前表拼接操作
从而降低你跨表查询 数据库的压力
注意select_related括号只能放外键字段(一对一和一对多)
 res = models.Book.objects.all().select_related(‘外键字段1__外键字段2__外键字段3__外键字段4‘)
"""
# prefetch_related  不主动连表
res = models.Book.objects.prefetch_related(‘publish‘)
"""
不主动连表操作(但是内部给你的感觉像是连表操作了)  而是将book表中的publish全部拿出来  在取publish表中将id对应的所有的数据取出
res = models.Book.objects.prefetch_related(‘publish‘)
括号内有几个外键字段 就会走几次数据库查询操作
"""
for r in res:
    print(r.publish.name)

事务

事务的定义:将多个sql语句操作变成原子性操作,要么同时成功,有一个失败则里面回滚到原来的状态,保证数据的完整性和一致性(NoSQL数据库对于事务则是部分支持)

ACID
  原子性
  一致性
  隔离性
  持久性

from django.db import transaction

with transaction.atomic():
    """数据库操作
    在该代码块中书写的操作 同属于一个事务
    """
    models.Book.objects.create()
    models.Publish.objects.create()
    # 添加书籍和出版社 就是同一个事务 要么一起成功要么一起失败
    print(‘出了 代码块 事务就结束‘)

原文地址:https://www.cnblogs.com/KrisYzy/p/11558812.html

时间: 2024-07-29 00:07:42

Django ORM中常用字段和参数的相关文章

django的form常用字段和参数

http://www.cnblogs.com/wupeiqi/articles/6144178.html Django的内置字段如下: Field required=True#请求不能为空 widget=None#HTML插件 label=None#用于生成lable标签或显示内容 initial=None#初始值 help_text=''#帮助信息(在标签旁边显示) error_messages=None#(错误信息{'required':'不能为空','invalid':'格式错误'}) s

django ORM模型常用字段、字段常用参数

在定义字段类型时,如果没有设置null=True,默认为null=False,即默认字段不为空 AutoField:数据库层面为int 类型,自增长,如果不指定主键,模型会自动生成一个叫做 id 的自增长的主键.如果需要指定一个其他名字并且具自增长的主键,使用AutoField也是可以的 BigAutoField:类似AutoField,数据范围更大 BooleanField字段:模型层面值为True或False(数据库层面值为1或0,类型tinyint),并且不接受null=True,即该字段

Django ORM常用字段及参数

目录 Django ORM常用字段及参数 models中的常用字段 字段内的关键字参数 数据库查询优化(面试问题) Django ORM如何开启事务操作 MTV与MVC模型(了解) Django ORM常用字段及参数 models中的常用字段 models中常用字段与数据库中的对应关系 models中常用字段 数据库对应字段 AutoField(primary_key=True) 主键字段 CharField(max_length=32) varchar(32) IntegerField() i

Django中常用字段

一.Djiango框架的常用字段 Django ORM 常用字段和参数 常用字段 常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. IntegerField 一个整数类型,范围在 -2147483648 to 2147483647.(一般不用它来存手机号(位数也不够),直接用字符串存,) CharField 字符类型,必须提供max_length参数, max_length表示字符长度. 这

Django框架之模型层 常用字段和参数

目录 一.Django ORM 常用字段和参数 1.1 常用字段 1.2 所有字段(争取记忆) 1.2.1 orm字段与MySQL字段对应关系 1.3 自定义字段 1.3 字段参数 1.3.1 DateField和DateTimeField的字段参数 二.关系字段 2.1 ForeignKey 2.1.1 字段参数 2.1.2 其余字段参数 2.2 OneToOneField 2.2.1 字段参数 2.3 ManyToManyField 2.3.1 字段参数 一些说明: 表的名称是自动生成的,如

ORM常用字段和参数

ORM常用字段和参数 一.ORM字段 1. AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. 2. IntegerField 一个整数类型,范围在 -2147483648 to 2147483647. 3. CharField 字符类型,必须提供max_length参数, max_length表示字符长度. 4. DateField 日期字段,日期格式 YYYY-MM-DD,相当于Python中的da

orm 常用字段及参数

一些说明: 表myapp_person的名称是自动生成的,如果你要自定义表名,需要在model的Meta类中指定 db_table 参数,强烈建议使用小写表名,特别是使用MySQL作为后端数据库时. id字段是自动添加的,如果你想要指定自定义主键,只需在其中一个字段中指定 primary_key=True 即可.如果Django发现你已经明确地设置了Field.primary_key,它将不会添加自动ID列. 本示例中的CREATE TABLE SQL使用PostgreSQL语法进行格式化,但值

ORM常用字段及参数

目录 ORM常用字段及参数 ORM常用字段 ORM字段参数 关系字段 必知必会13条 13个必会操作总结 ORM常用字段及参数 ORM常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. IntegerField 一个整数类型,范围在 -2147483648 to 2147483647.(一般不用它来存手机号(位数也不够),直接用字符串存,) CharField 字符类型,必须提供max_len

models常用字段及参数,orm查询优化, choices参数及实际应用

一.自定义字段类型 from django.db import models # Create your models here. # 自定义CHAR类型 from django.db.models import Field class RealCharField(Field): # 这里是要继承Field类的 def __init__(self, max_length, *args, **kwargs): self.max_length = max_length # 拦截一个父类的方法 操作完