ORM

Posted 周军豪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ORM相关的知识,希望对你有一定的参考价值。

 

对应关系

 

 映射关系:
       python的类名对应的SQL语句的表名
       python的类属性对应的SQL语句的表名下的字段
       python的类属性的约束对应的SQL语句的表名下的字段类型
                                     
       类的实例对象---------------表中的一条记录对象

 

 

创建表

 

        class Student(models.Model):
                nid=models.AutoField(primary_key=True)         #  主键约束
                name=models.CharField(max_length=32)           #  字符串字段
                birth=models.DateField()                       #  日期类型
                class_id=models.IntegerField(default=0)      #  整数类型

 

字段类型详细

技术分享图片
使用时需要引入django.db.models包,字段类型如下:

AutoField:自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性。

BooleanField:布尔字段,值为True或False。

NullBooleanField:支持Null、True、False三种值。

CharField(max_length=字符长度):字符串。TextField:大文本字段,一般超过4000个字符时使用。
参数max_length表示最大字符个数。

IntegerField:整数。

DecimalField(max_digits=None, decimal_places=None):十进制浮点数。FloatField:浮点数。
参数max_digits表示总位数。
参数decimal_places表示小数位数。

DateField[auto_now=False, auto_now_add=False]):日期。

TimeField:时间,参数同DateField。
参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"时间戳,它总是使用当前日期,默认为false。
参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false。
参数auto_now_add和auto_now是相互排斥的,组合将会发生错误。

DateTimeField:日期时间,参数同DateField。

FileField:上传文件字段。

ImageField:继承于FileField,对上传的内容进行校验,确保是有效的图片。
View Code

 

 

字段选项

 

每个字段有一些特有的参数,例如,CharField需要max_length参数来指定VARCHAR数据库字段的大小。还有一些适用于所有字段的通用参数。 

这些参数在文档中有详细定义,这里我们只简单介绍一些最常用的:

技术分享图片
(1)null

如果为True,Django 将用NULL 来在数据库中存储空值。 默认值是 False.

(1)blank

如果为True,该字段允许不填。默认为False。
要注意,这与 null 不同。null纯粹是数据库范畴的,而 blank 是数据验证范畴的。
如果一个字段的blank=True,表单的验证将允许该字段是空值。如果字段的blank=False,该字段就是必填的。

(2)default

字段的默认值。可以是一个值或者可调用对象。如果可调用 ,每有新对象被创建它都会被调用。

(3)primary_key

如果为True,那么这个字段就是模型的主键。如果你没有指定任何一个字段的primary_key=True,
Django 就会自动添加一个IntegerField字段做为主键,所以除非你想覆盖默认的主键行为,
否则没必要设置任何一个字段的primary_key=True。

(4)unique

如果该值设置为 True, 这个数据字段的值在整张表中必须是唯一的

(5)choices
由二元组组成的一个可迭代对象(例如,列表或元组),用来给字段提供选择项。 如果设置了choices ,默认的表单将是一个选择框而不是标准的文本框,而且这个选择框的选项就是choices 中的选项。

这是一个关于 choices 列表的例子:

YEAR_IN_SCHOOL_CHOICES = (
    (FR, Freshman),
    (SO, Sophomore),
    (JR, Junior),
    (SR, Senior),
    (GR, Graduate),
)
每个元组中的第一个元素,是存储在数据库中的值;第二个元素是在管理界面或 ModelChoiceField 中用作显示的内容。 在一个给定的 model 类的实例中,想得到某个 choices 字段的显示值,就调用 get_FOO_display 方法(这里的 FOO 就是 choices 字段的名称 )。例如:

from django.db import models

class Person(models.Model):
    SHIRT_SIZES = (
        (S, Small),
        (M, Medium),
        (L, Large),
    )
    name = models.CharField(max_length=60)
    shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)


>>> p = Person(name="Fred Flintstone", shirt_size="L")
>>> p.save()
>>> p.shirt_size
L
>>> p.get_shirt_size_display()
Large
View Code

更多详见模型字段参考

一旦你建立好数据模型之后,django会自动生成一套数据库抽象的API,可以让你执行关于表记录的增删改查的操作。

 

 

创建命令

 

python manage.py makemigrations  #生成文件

python manage.py migrate   #创建表

 

 

 

单表操作

 

    查询记录API:

           (1)Student.objects.all()    #返回的QuerySet类型 查询所有记录    [obj1,obj2....] 
           
           (2)Student.objects.filter() #返回的QuerySet类型 查询所有符合条件的记录

           (3)Student.objects.exclude()#返回的QuerySet类型 查询所有不符合条件的记录

           (4)Student.objects.get()    #返回的models对象   查询结果必须有且只有一个,否则报错

           (5)Student.objects.all().first()      #返回的models对象   查询结果集合中的第一个

           (6)Student.objects.filter().last()    #返回的models对象   查询结果集合中的最后一个

           (7)Student.objects.all().values("name","class_id")  #返回的QuerySet类型  ,列表中存放的字典

           (8)Student.objects.all().values_list("name","class_id")  #返回的QuerySet类型  ,列表中存放的元组

           (9)Student.objects.all().order_by("class_id")   # 按指定字段排序,不指定,按主键排序

           (9.1)Student.objects.all().order_by("-class_id")   # 按指定字段 降序 排序

           (10)Student.objects.all().count()  # 返回的记录个数  数字类型

           (11)Student.objects.all().values("name").distinct()  #字段去重,用在values() 后

           (12)Student.objects.all().exist()  #判断是否为空,如果QuerySet包含数据,就返回True,否则返回False 原理是limit 1
           
    单表查询之双下划线 __

            Student.objects.filter()    
            models.Tb1.objects.filter(id__lt=10, id__gt=1)   # 获取id大于1 且 小于10的值
       lt 小于 gt大于
models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据 models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in models.Tb1.objects.filter(name__contains="ven") #包含ven 区分大小写 models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感 models.Tb1.objects.filter(id__range=[1, 2]) # 范围bettwen and 什么到什么之间(包含最后一个) startswith, #什么开头 istartswith, #什么开头,大小写不敏感 endswith, #什么结尾 iendswith #什么结尾,大小写不敏感 添加记录:
方式1:
          s
=Student(name=‘‘,birth=‘‘,class_id=‘‘)     s.save()
      方式2: stu_obj
=Student.objects.create(name=‘‘,birth=‘‘,class_id=‘‘) # stu_obj是添加的记录对象 删除记录: Student.objects.filter(nid=1).delete() # QuerySet类型调用 修改记录: Student.objects.filter(nid=1).update(name="yuan") # QuerySet类型调用

 





以上是关于ORM的主要内容,如果未能解决你的问题,请参考以下文章

ORM 和 .NET 代码保护器

ORM(学说)和SQL之间的代码比较?

微信小程序代码片段

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

片段和活动之间的核心区别是啥?哪些代码可以写成片段?