• django笔记(3)-数据库操作


    一:路由系统
        url
        1.url(r'^index/', views.index),url(r'^home/',views.Home.as_view()), 一个url对应一个函数或一个类
        2.url(r'^detail-(d+).html',views.detail), 一类url对应一个函数或一个类 动态url
        3.url(r'^detail-(?P<nid>d+)-(?P<uid>d+).html',views.detail), 正则表达式 第一数字匹配赋值给nid 在函数里面就不用考虑顺序 比较常用 动态url

            ps: def detail(request,*args,**kwargs):
                    pass
        实战:
                1.
                url(r'^detail-(d+)-(d+).html',views.detail)
                def func(request,nid,uid):
                    pass

                def func(request,*args):
                    args=(2,6)
                    pass

                2.
                url(r'^detail-(?P<nid>d+)-(?P<uid>d+).html',views.detail)
                def func(request,nid,uid):
                    pass

                def func(request,**kwargs):
                    kwargs={'nid':1,'uid':3}


        4.name:方便提交表单
        URL路由关系进行命名,以后可以根据此名称自动生成自己想要的URL
        url(r'^index999999999/', views.index,name='indexx'),
        def func(request,*args,**kwargs):
            from django.urls import reverse
            reverse('indexx')  #生成index999999999

        url(r'^index999999999/(d+)/(d+)/', views.index,name='indexx'),
        def func(request,*args,**kwargs):
            from django.urls import reverse
            reverse('indexx',args=(1,6)) #生成index999999999/1/6

        url(r'^index999999999/(?P<nid>d+)/(?P<uid>d+)/', views.index,name='indexx'),
         def func(request,*args,**kwargs):
            from django.urls import reverse
            reverse('indexx',kwargs=('nid':11,'uid':66)) #生成index999999999/11/66

       xxxx.html
        {% url "indexx" %}       #对应index999999999
        {% url "indexx" 1 6 %}   #对应index999999999/1/6
        {% url "indexx" nid=11 uid=66 %}  #对应index999999999/11/66


        模板语言里面:
            {% url 'indexxx' %}
            {% url 'indexxx' 8 6  %}


            注:{{ request.path_info }} 当前页面url



         5.



    二:视图
        request.POST
        request.GET
        request.FILES

        #获取checkbox等多选内容
        request.POST.getlist()

        #上传文件,form标签做特殊设置enctype="multipart/form-data"
        obj=request.FILES.get('fafafa')
        obj.name
        f=open(obj.name,mod='wb')
        for item in obj.chunks():
            f.write(item)
        f.close()


        FBV  function base view
        url.py
        index -->函数名
        view.py
           def 函数(request):
               ...

        CBV  class base view  执行类里面的指定的方法
        /index/  -->类
        建议两者都用


    三:模板


    四:orm操作
        select * from tb where id>1
        #对应关系
        models.tb.objects.filter(id__gt=1)
        models.tb.objects.filter(id=1)
        model.tb.objects.filter(id__lt=1)

        a.创建类(代码)
        from django.db import models
    class UserInfo(models.Model):
        # id列,自增,主键
        # 用户名列,字符串类型,指定长度
        username=models.CharField(max_length=32)
        password=models.CharField(max_length=64)

       b.注册app:
        settings.py:
                INSTALLED_APPS =[
                '''
                'app01',
                ]

        c.执行命令:
        python manage.py makemigrations  生成migrations下的文件
        python manage.py migrate         根据生成的文件创建表和数据库

        d.连接mysql
        django默认使用MySQLdb模块连接mysql,但目前py3.x没有这个模块
        修改为pymsql
        project下的__init__.py
        import pymysql
        pymysql.install_as_MySQLdb()

        : base.py将36行注释
            if version < (1, 3, 13):
                raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)



            File "C:Python37libsite-packagesdjangodbackendsmysqloperations.py", line 146, in last_executed_query

        query = query.decode(errors='replace')

      AttributeError: 'str' object has no attribute 'decode'

      解决办法:打开此文件把146行的decode修改为encode
        如果已经有migrations文件就直接执行 python manage.py migrate 创建表


            1.根据类(代码)自动创建数据库表
            app下的model.py

            字段:字符串
                 数字
                 时间
                 二进制
                 自增(primary_key=True)

            参数:
                null                数据库中字段是否可以为空 null=True
                db_column           数据库中字段的列名  db_column='xx'
                default             数据库中字段的默认值 default='xx'
                primary_key         数据库中字段是否为主键  primary_key=True
                db_index            数据库中字段是否可以建立索引 db_index=True
                unique              数据库中字段是否可以建立唯一索引 unique=True
                unique_for_date     数据库中字段【日期】部分是否可以建立唯一索引  unique_for_date=True
                unique_for_month    数据库中字段【月】部分是否可以建立唯一索引  unique_for_month=True
                unique_for_year     数据库中字段【年】部分是否可以建立唯一索引  unique_for_year=True

                auto_now_add        创建时 自动生成创建时间 auto_now_add=True

                auto_now            更新时 自动生成更改时间 auto_now=True
                                    obj=models.UserGroup.objects.filter(uid='1').first() 更新uptime用这种方法
                                    obj.caption="DBA"
                                    obj.save()

                verbose_name        django  admin中显示的字段名称  verbose_name="姓名"
                blank               django  admin中是否允许用户输入为空  blank=True
                editable            django  admin中是否可以编辑  editable=False
                help_text           django admin中该字段的提示信息 help_text="邮件"

                choices             django admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
                                    :user_type_choice=(
                                                    (1,'super user'),
                                                     (2,'normal user'),
                                                    (3,'normal normal user'),
                                                     )
                                     user_type_id=models.IntegerField(choices=user_type_choice,default=1)

                error_messages      自定义错误信息(字典类型),从而定制想要显示的错误信息;
                                    字典健:null, blank, invalid, invalid_choice, unique, and unique_for_date
                                    如:{'null': "不能为空.", 'invalid': '格式错误'}

                validators          自定义错误验证(列表类型),从而定制想要的验证规则

            2.根据类(代码)对数据库表中的数据进行各种操作
                   一对多:
                        a.外键
                        b.外键字段_id
                        c.外键id创建数据 models.tb.object.create(name='root',user_group_id=1)

                        d.
                            user_list=models.tb.object.all()
                            for row in user_list:
                                row.id
                                row.user_group_id
                                row.user_group.caption 跨表操作


        数据库配置
        DATABASES = {
        'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME':'dbname',
        'USER': 'root',
        'PASSWORD': 'xxx',
        'HOST': '',
        'PORT': '',
        }
    }

    https://www.cnblogs.com/wupeiqi/articles/5237704.html


    创建外键
        models.ForeignKey("关联的外表",to_field='外表的主键')
        class UserType(models.Model):
            caption=modules.CharField(max_length=32)
            id   caption
            1  普通用户
            2.VIP用户
            3.游客

        class User(models.Model):
            age=models.IntergerField()
            name=models.CharField(max_length=10)
            user_type=models.ForeignKey('UserType',to_field='id')

            name  age  user_type_id
            mark   19    1
            gasol  31    2
            lebrom  29   3

  • 相关阅读:
    iframe的边框如何去掉
    vue-computed计算属性用法
    Vue-input框checkbox强制刷新
    TED 积极心理学感悟(二)
    路由器使用子网掩码进行分组转发的过程
    DHCP 服务器和 DHCP 客户端的交互过程
    IPv4 协议中的 NAT 协议和 CIDR 协议
    IPv6 是解决 IPv4 地址耗尽问题的根本途径
    TED 积极心理学感悟
    初级错误之 for 中的局部变量
  • 原文地址:https://www.cnblogs.com/leiwenbin627/p/11005941.html
Copyright © 2020-2023  润新知