zoukankan      html  css  js  c++  java
  • Django(六)

    一、一大波model操作

    1. 创建数据库表
      # 单表
        # app01_user ==> tb1
        # users
        class User(models.Model):
          name = models.CharField(max_length=32)
          pwd = models.CharField(max_length=32)

          class Meta:
          # 数据库中生成的表名称 默认 app名称 + 下划线 + 类名
            db_table = "tb1"

            index_together = [
              ("name", 'pwd'),
            ]
        # 最左前缀的模式:
        # select * from where name='xx'
        # select * from where name='xx' and email = 'xx'
        # select * from where email = 'xx' # 无法命中索引

      unique_together = (("driver", "restaurant"),)

      verbose_name = “上课记录”
      verbose_name_plural=““上课记录””

      # 一对多/一对一/多对多

      一对多:
        def func():
          return 5


        class UserType(models.Model):
          name = models.CharField(max_length=32)


        class User(models.Model):
          name = models.CharField(max_length=32)
          pwd = models.CharField(max_length=32)
          .... ForiegnKey(to="UserType",to_field='id',on_delete=models.SET(func))

        # delete from user where id=1
        # delete from UserType where id=1 # 报错

        # UserType.objects.filter(id=1).delete()



      # 正向
        # v = User.objects.all()
        # for item in v:
          # item.user
          # item.pwd
          # item.ut.name

        # User.objects.all().values('user','ut__name')

      # 反向
        # v = UserType.objects.all()
        # for item in v:
          # item.name
          # item.id
          # item.user_set.all() # item.b.all()


      # models.UserType.objects.all().values('name','user__pwd')

      多对多:
        a. django创建第三张表
          m2m.remove
          m2m.add
          m2m.set
          m2m.clear
          m2m.filter()
        b. 自定义第三张表(无m2m字段)

          自己链表查询

        c. 自定义第三张表(有m2m字段)
          # 通过m2m字段查操作
          # 通过m2m字段 clear




      2. 操作数据库表
        - 基本操作
        - QuerySet中的方法:
        - 返回QuerySet类型(select_related,prefetch_related)

      select_related
        users = models.User.objects.all().select_related('ut')
        for row in users:
          print(row.user,row.pwd,row.ut_id)
          print(row.ut.name)
          print(row.tu.name) # 再发起一次SQL请求

      prefetch_related
        users = models.User.objects.filter(id__gt=30).prefetch_related('ut','tu')
        # select * from users where id > 30
        # 获取上一步骤中所有的ut_id=[1,2]
        # select * from user_type where id in [1,2]
        # select * from user_type where id in [1,2]

        for row in users:
          print(row.user,row.pwd,row.ut_id)
          print(row.ut.name)

      3. 数据验证(弱)

        full_clean进行验证
          - 每个字段的正则
          - clean钩子


    二、Form操作
      数据验证(强大)

        1、Form操作基础回顾

          验证和生成HTML

          新URL方式时,用验证和生成html功能

          ajax方式时,可以只用验证

        2、动态的获取数据库的数据(select)

          (1)其中一种写法

          

          

          (2)重写构造来实现的方法

          

          

          (3)针对choices的写法,构造方法

          

          (4)ModelChoicesField方法

          

          

          注:这个需要models里面,自己定制__str__

          

          如果没有的话页面上看到的就是如下

          

       3、内置钩子

        (1)字段的验证

          _clean_field

          

          

          注:必须要有返回值

          

        (2)整体进行验证,例如user和pwd整体验证(用户登录时)

          _clean_form

          

        (3)_post_clean

          

        

        总结:is_valid-->self.errors-->full_clean-->clean_field,clean_form,post_clean

          - 每一个字段(正则,字段钩子)
          - clean
          - _post_clean
          _cleand的错误信息都放在:__all__

          

          




    三、序列化操作

      对ErrorDict序列化
        - 自定义encoder

        



      对QuerySet进行序列化
      第一种(Django提供得自身模块):
        from django.core import serializers

        v = models.tb.objects.all()
        data = serializers.serialize("json", v)

      第二种(控制每一行是字典):

      import json
      from datetime import date
      from datetime import datetime
      #如果遇到datime就得自定制
      class JsonCustomEncoder(json.JSONEncoder):

        def default(self, field):

        if isinstance(field, datetime):
          return field.strftime('%Y-%m-%d %H:%M:%S')
        elif isinstance(field, date):
          return field.strftime('%Y-%m-%d')
        else:
          return json.JSONEncoder.default(self, field)
      

      #内部是字典,外部是Queryset
      v = models.tb.objects.values('id','name','ctime')

      #转换成列表
      v = list(v)
      v = json.dumps(v,cls=JsonCustomEncoder)

  • 相关阅读:
    【提高测试】飘雪圣域(树状数组)
    【BZOJ2820】YY的GCD(莫比乌斯反演)
    【BZOJ2301】【HAOI2011】—Problem b(莫比乌斯反演)
    【POJ2318】—TOYS(计算几何)
    React-状态提升
    React-表单
    React-条件渲染
    React-列表 & Key
    React-HelloWorld
    MongoDB中的读写锁
  • 原文地址:https://www.cnblogs.com/manger/p/6321886.html
Copyright © 2011-2022 走看看