zoukankan      html  css  js  c++  java
  • 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<year>[0-9]{4})/(?P<month>[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<year>[0-9]{4})/(?P<month>[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_112233d+', message='又错误了', code='c2'),
                                        EmailValidator(message='又错误了', code='c3'), ]
                                )


                
                
                
               

  • 相关阅读:
    POJ 3630 Phone List/POJ 1056 【字典树】
    HDU 1074 Doing Homework【状态压缩DP】
    POJ 1077 Eight【八数码问题】
    状态压缩 POJ 1185 炮兵阵地【状态压缩DP】
    POJ 1806 Manhattan 2025
    POJ 3667 Hotel【经典的线段树】
    状态压缩 POJ 3254 Corn Fields【dp 状态压缩】
    ZOJ 3468 Dice War【PD求概率】
    POJ 2479 Maximum sum【求两个不重叠的连续子串的最大和】
    POJ 3735 Training little cats【矩阵的快速求幂】
  • 原文地址:https://www.cnblogs.com/yb635238477/p/9409392.html
Copyright © 2011-2022 走看看