django框架之ORM概念介绍

昨日内容回顾:

  day67
内容回顾:
    1. 视图
        1. CBV 和 FBV
            from django.views import View
            
            class AddPublisher(View):
                
                def dispatch(self, request, *args, **kwargs):
    
                    ret = super().dispatch(request, *args, **kwargs)

                    return ret
                    
                def get(self,request):
                    pass
                    
                def post(self,request):
                    pass
            使用:
                url(r'^add_publisher/', views.AddPublisher.as_view()),        
                    
        2. CBV的简单的流程
            1. AddPublisher.as_view()得到一个view函数
                url(r'^add_publisher/', view),
            2. 请求到来的时候 执行view:
                1. 实例化AddPublisher的类,赋值给self
                2. 执行dispatch方法
                3. 通过反射获取到get或者post的方法
                4. 执行get或者post方法,返回HttpResponse对象
        3. 装饰器的使用
            1. FBV 正常使用  
                @装饰器
                
            2. CBV
                from django.utils.decorators import method_decorator
                
                1. 给get或者post方法加
                2. 给dispatch方法加
                3. 给类加(写name='get')
        4. request
            request.method        请求方法 GET POST
            request.GET            URL传参  {}
            request.POST        form表单传的参数
            request.body        请求体
            request.FILES       上传的文件
            request.path_info   URL路径   不包含域名和URL参数
            
            request.get_full_path()   URL路径包含URL参数
            request.get_host()      获取IP和端口
        5. response
        
            1. HttpResponse('字符串')    —》 页面看到的就是字符串  content—type: text/html;charset=utf8
            2. render(request,'HTML文件名',{参数})        ——》返回一个页面
            3. redirect('/index/')        跳转 重定向  返回一个响应头  Location:'/index/'
            4. JsonResponse(字典)    content—type: application/json
                返回列表时     safe=False
                JsonResponse(data,safe=False)
        
    2. 路由
        1.
            from django.conf.urls import url
            
            urlpatterns =[
                url(正则表达式,视图,参数,name)
                url(正则表达式,视图,参数,name)
                url(正则表达式,视图,参数,name)
            ]
        2. 正则表达式
            加$  
            [0-9]  /d
            + 一个或多个
            ?0个或1个
            * 0个或多个
            . 除了换行符的所有
            
        3. 分组和命名分组
            
            url(r'book/[0-9]{4}/[0-9]{2}/',views.book)
            
            无名分组:
                url(r'book/([0-9]{4})/([0-9]{2})/',views.book)
                按照位置传参的方式传给视图
                
            
            命名分组
                url(r'book/(?P[0-9]{4})/(?P[0-9]{2})/',views.book)
                按照关键字传参的方式给视图
                
            捕获到的参数都是字符串
            
        4. 命名url和url的反向解析
            
            url(r'home',view,home,name='home')
            url(r'book/([0-9]{4})/([0-9]{2})/',views.book,name='book')
            url(r'book/(?P[0-9]{4})/(?P[0-9]{2})/',views.book,name='book2')
            
            
            视图中反向解析URL:
                from django.shortcuts import reverse
                
                reverse('home')    ——》 /home/
                reverse('book',args=('1999','08'))        ——》/book/1999/08/
                reverse('book2',kwargs={'year':'1998','month':'08'})  ——》 /book/1998/08/
                
                
            模板中反向解析URL:
                {% url 'home' %}  ——》 /home/
                无名分组:
                
                    {% url 'book' '1999' '08' %}  ——》/book/1999/08/
                
                有名分组:
                    {% url 'book' '1999' '08' %}  ——》/book/1999/08/
                    {% url 'book' year='1999' month='08' %}  ——》/book/1999/08/
                    {% url 'book' month='08' year='1999' %}  ——》/book/1999/08/
                
        5. include
            from app01 import urls as app01_urls
            from app02 import urls as app02_urls
        
            url('app01/', include(app01_urls)),
            url('app02/', include(app02_urls))
            
            
            
            url('app01/', include('app01.urls')),
            url('app02/', include('app02.urls'))
            
        5. namespace
            
            
    3. ORM
        1. mysql的配置
            1. 创建mysql数据库
            2. settings配置
                ENGINE:    'mysql'
                NAME: '数据库名称'
                HOST:IP
                PORT: 3306
                USER: 'root'
                PASSWORD: ''
                
            3. 告诉django使用pymysql来连接mysql数据库
                在项目同名的文件夹下的__init__.py中写:
                    import pymysql
                    pymysql.install_as_MySQLdb()
                    
            4. 创建model
                class Person(models.Model)
                    name = models.CharField(max_length=32)
                    
            5. 执行两条数据库命令
                python manage.py makemigrations   # 记录models的变更记录
                python manage.py migrate         # 把变革记录更新到数据库中
                
        2. ORM操作
        
            1. 查
                models.Person.objects.all()  # 查所有
                models.Person.objects.get(id=1,name='xxx')    # 查一个对象 满足条件的
                models.Person.objects.filter(id=1,name='xxx')  # 查询满足条件的所有对象 列表
                models.Person.objects.filter(id=1,name='xxx').order_by('id')  
                
                属性:
                    pub_obj.name
                    
                    外键的 book
                    book_obj.name
                    book_obj.publisher   ——》 这是书籍关联的出版社对象
                    book_obj.publisher_id   ——》 这是数据库存的数据
                    book_obj.publisher.id   
                    book_obj.publisher.name

                    多对多 author
                    
                    author.name
                    
                    author.books    ——》 多对多的管理对象
                    author.books.all()   所有作者关联的书籍对象列表
                    
            2. 增加:
                models.Publisher.objects.creatte(name='xxxx')
                
                外键
                models.Book.objects.creatte(name='xxxx',publisher=pub_obj)
                models.Book.objects.creatte(name='xxxx',publisher_id=pub_obj.id)
                
                多对多
                
                author_obj = models.Author.objects.creatte(name='xxx')
                author_obj.books.set([1,2,3])
                
            3. 删除
                models.Publisher.objects.get(id=1).delete()
                models.Publisher.objects.filter(id=1).delete
                
            4. 修改
                
                pub_obj.name = new_name
                pub_obj.save()
                
                book_obj.name= new_name
                book_obj.publisher = new_pub_obj
                book_obj.publisher_id = 2
                book_obj.save()
                
                author_obj.name=new_name
                author_obj.save()
                author_obj.books.set([1,2])
                
 在我们图书管理系统中,删除有三个url,现在有一个需求把三个url写成一个实现同样的功能。
            urls中这样写:

url(r'del_(publisher|book|author)/(\d+)',views.delete_all)

views中的代码:

 def delete_all(request,table,del_id):
    print(table)
    table_obj = getattr(models,table.capitalize())
    table_obj.objects.get(id = del_id).delete()
    return redirect(reverse(table))

url通过正则匹配分组,将publisher,book,author,当作参数传给delete_all,然后table接受参数后,通过反射getattr取到类然后进行ORM操作。最后通过反向解析reverse返回。

ORM介绍:

对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。

Django中的ORM:

Django项目使用MySQL数据库:

1. 在Django项目的settings.py文件中,配置数据库连接信息:

1
2
3
4
5
6
7
8
9
10
DATABASES = {
     "default" : {
         "ENGINE" : "django.db.backends.mysql" ,
         "NAME" : "你的数据库名称" # 需要自己手动创建数据库
         "USER" : "数据库用户名" ,
         "PASSWORD" : "数据库密码" ,
         "HOST" : "数据库IP" ,
         "POST" : 3306
     }
}

2. 在与Django项目同名的目录下的__init__.py文件中写如下代码,告诉Django使用pymysql模块连接MySQL数据库:

1
2
3
import pymysql
 
pymysql.install_as_MySQLdb()

字段:

常用字段 

AutoField

自增的整形字段,必填参数primary_key=True,则成为数据库的主键。无该字段时,django自动创建。

一个model不能有两个AutoField字段。

IntegerField

一个整数类型。数值的范围是 -2147483648 ~ 2147483647。

CharField

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

DateField

日期类型,日期格式为YYYY-MM-DD,相当于Python中的datetime.date的实例。

参数:

  • auto_now:每次修改时修改为当前日期时间。
  • auto_now_add:新创建对象时自动添加当前日期时间。

auto_now和auto_now_add和default参数是互斥的,不能同时设置。

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) - 二进制类型


自定义字段:

自定义一个char类型字段:

class MyCharField(models.Field):
    """
    自定义的char类型的字段类
    """
    def __init__(self, max_length, *args, **kwargs):
        self.max_length = max_length
        super(MyCharField, self).__init__(max_length=max_length, *args, **kwargs)
 
    def db_type(self, connection):
        """
        限定生成数据库表的字段类型为char,长度为max_length指定的值
        """
        return 'char(%s)' % self.max_length

使用自定义char类型字段:

class Class(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=25)
    # 使用自定义的char类型的字段
    cname = MyCharField(max_length=25)

字段参数:

   null                数据库中字段是否可以为空

     db_column           数据库中字段的列名
     default             数据库中字段的默认值
     primary_key         数据库中字段是否为主键
     db_index            数据库中字段是否可以建立索引
     unique              数据库中字段是否可以建立唯一索引
     unique_for_date     数据库中字段【日期】部分是否可以建立唯一索引
     unique_for_month    数据库中字段【月】部分是否可以建立唯一索引
     unique_for_year     数据库中字段【年】部分是否可以建立唯一索引
 
     verbose_name        Admin中显示的字段名称
     blank               Admin中是否允许用户输入为空
     editable            Admin中是否可以编辑
     help_text           Admin中该字段的提示信息
     choices             Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
                         如:gf = models.IntegerField(choices = [( 0 , '何穗' ),( 1 , '大表姐' ),],default = 1 )
 
     error_messages      自定义错误信息(字典类型),从而定制想要显示的错误信息;
                         字典健:null, blank, invalid, invalid_choice, unique, and unique_for_date
                         如:{ 'null' : "不能为空." , 'invalid' : '格式错误' }
 
     validators          自定义错误验证(列表类型),从而定制想要的验证规则
                         from django.core.validators import RegexValidator
                         from django.core.validators import EmailValidator,URLValidator,DecimalValidator,\
                         MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator
                         如:
                             test = models.CharField(
                                 max_length = 32 ,
                                 error_messages = {
                                     'c1' : '优先错信息1' ,
                                     'c2' : '优先错信息2' ,
                                     'c3' : '优先错信息3' ,
                                 },
                                 validators = [
                                     RegexValidator(regex = 'root_\d+' , message = '错误了' , code = 'c1' ),
                                     RegexValidator(regex = 'root_112233\d+' , message = '又错误了' , code = 'c2' ),
                                     EmailValidator(message = '又错误了' , code = 'c3' ), ]
                             )


            
            
            
           

转载于:https://www.cnblogs.com/yb635238477/p/9409392.html

你可能感兴趣的:(django框架之ORM概念介绍)