zoukankan      html  css  js  c++  java
  • Django学习-7-ORM操作

    select * from tb where id > 1    # 对应关系
        models.tb.objects.filter(1id__gt=)    
        models.tb.objects.filter(id=1)
        models.tb.objects.filter(id__lt=1)
     
    创建类
        a.先写类
        from django.db import models
     
        # 生成的表名 app01_userinfo
        class UserInfo(models.Model):
            # id列,自增,主键
            # 用户名列,字符串类型,指定长度
            username = models.CharField(max_length=32)
            password = models.CharField(max_length=64)
            b. 注册APP
        settings.py
        INSTALLED_APPS = [
            'django.contrib.admin',
            'django.contrib.auth',
            'django.contrib.contenttypes',
            'django.contrib.sessions',
            'django.contrib.messages',
            'django.contrib.staticfiles',    
            ☆☆☆☆-> 'app01',    
        ]
     
        如果不想使用sqlite数据库,也可以到settings里配置成mysql数据库
        DATABASES = {
            'default:'{
            'ENGINE':'django.db.backends.mysql',
            'NAME':'dbname',
            'USER':'root',
            'PASSWORD':'xxxx',    
            'HOST':'',
            'PORT':'',    
                }
        }
        c. 执行命令
     
        python manage.py makemigrations
        python manage.py migrate
     
        d. ********** 注意 ***********
     
        Django默认使用MySQLdb模块链接MySQL    (python3,现在没有支持mysqldb)
        主动修改为pymysql,在project同名文件夹下的__init__文件中添加如下代码即可:
     
            import pymysql
            pymysql.install_as_MySQLdb()
     
     
        1. 根据类自动创建数据库表
        如果创建或更改表结构时,一直失败,可以尝试删除makemigrations下的文件
        # app下的models.py
        python manage.py makemigrations
        python manage.py migrate  
      
        字段:
            字符串类型                                   CharField
            数字                                            IntegerField,BigIntegerField
            时间                                            DateTimeField
            二进制                                         BinaryField
            自增(primary_key=True)           AutoField
              Date Char Url 都是字符串,为什么要区分是因为要给Django admin管理使用
    参数解析
    字段的参数作用
    null db是否可以为空
    default 默认值
    primary_key 主键
    db_column 列名
    db_index 是否建立索引
    unique 唯一索引
    on_delete 级联操作:models.CASCADE级联删除,PROTECT抛出ProtectedError,models.SET_NULL置空模式,models.SET_DEFAULT置默认值,SET(): 自定义一个值
    unique_for_date 2006:11:11 11:11:11 只对时间索引
    unique_for_month 2006:(11):11 11:11:11 只对月份索引
    unique_for_year 2006:11:11 11:11:11 只对年份索引
    auto_now 创建时,自动生成时间 执行obj.save()时才更新
    auto_now_add 更新时,自动更新为当前时间
    choices django admin中显示下拉框,避免连表查询
    blank django admin是否可以为空
    verbose_name django admin显示字段中文(verbose_name替换为其值显示)
    editable django admin是否可以被编辑
    error_messages 错误信息
    help_text django admin输入框下面的小提示
    validators django form ,自定义错误信息
     
        # obj = UserGroup.objects.filter(id=1).update(caption='CEO')←←
        # obj = UserGroup.objects.filter(id=1).first()
        # obj.caption = "CEO"
          # obj.save()
           
         创建 Django 用户:python manage.py createsuperuser
     
      
        增删查改时,可以使用同一个HTML,在处理时分发不用的views函数       ------->      详细例子day19,views函数模块
        增
        1.models.User.objects.create(name='aaa',age=18)
        2.dic = {'name': 'xx', 'age': 19}
           models.User.objects.create(**dic)
     
     
        3.obj = models.User(name='aaa',age=18)
           obj.save()
        删
        models.User.objects.filter(id=1).delete()
        改
        models.User.objects.filter(id__gt=1).update(name='aaa',age=22)
        dic = {'name': 'xx', 'age': 19}
        models.User.objects.filter(id__gt=1).update(**dic)
        查
        models.User.objects.filter(id=1,name='root')
        models.User.objects.filter(id__gt=1,name='root')                相当于 and 多条件
        models.User.objects.filter(id__lt=1)
        models.User.objects.filter(id__gte=1)
        models.User.objects.filter(id__lte=1)
     
        models.User.objects.filter(id=1,name='root')
        dic = {'name': 'xx', 'age__gt': 19}
        models.User.objects.filter(**dic)
     
     
        v1 = models.Business.objects.all()                                             # QuerySet ,内部元素都是对象    v1.xxx
        v2 = models.Business.objects.all().values('id','caption')            # QuerySet ,内部元素都是字典       v2.xxx
        v3 = models.Business.objects.all().values_list('id','caption')         # QuerySet ,内部元素都是元组     v3.1 v3.2
     
        # 获取到的一个对象,如果不存在就报错
        models.Business.objects.get(id=1)
        结果是对象或者None = models.Business.objects.filter(id=1).first()
        models.tb.object.create(name='root', user_group_id=1)
        d.
            userlist = models.tb.object.all()
            for row in userlist:
            row.id
            row.user_group_id
            row.user_group.caption
     
        默认取出来的是QuerySet列表,可以使用一下方法直接获取QuerySet对象
            model.UserInfo.objects.filter(name='xxx').first()                        如果单条数据不存在时,会直接报错,所以要加try expect
        获取QuerySet对象个数
            model.UserInfo.objects.filter(name='xxx').count()
        
        连表操作会造成性能损失(效率非常低),对于固定的几个类型的外键关联时,可以使用choices将类型放至内存中
                user_type_choices = {
                    (1,'超级用户'),
                    (2,'普通用户'),
                    (3,'其他用户'),
                }
                user_type_id = models.IntegerField(choices=user_type_choices,default=1)        ------->      Django admin 中能直接看到对应值
     
        获取数据库表时,连同关联表一并取出。这样,在使用外键时(list.外键字段.外键关键字,就不用再次查询数据库,减少数据库操作)  
        list = models.UserInfo.objects.all().select_related('user_type')
     
        
            
        外键:
                    class UserType(models.Model):
                    caption = models.CharField(max_length=32)
                    id caption
                    # 1,普通用户
                    # 2,VIP用户
                    # 3, 游客
     
                    class User(models.Model):
                    age = models.IntergerFiled()
                    name = models.CharField(max_length=10)#字符长度
                    # user_type_id = models.IntergerFiled() # 约束,
                    user_type = models.ForeignKey("UserType",to_field='id') # 约束,         ---------->    默认    user_type_id
                    使用外键的字段
                        models.User.objects.filter(id=1).first().caption
                        获取到QuerySet对象是 :         QuerySet[obj(id,username,email,user_group_id,user_group_id(uid,caption))]
                        所以print user_group_id 是一个UserGroup对象
     
                    name age user_type_id
                    # user1 18 3
                    # user2 18 2
                    # user3 18 2
     
     
                    外键巧用
                    1.
                            models.User.objects.create(
                                    username="...",
                                    password='...',
                                    ...,
                                    user_group = models.UserGroup.objects.filter(id=1).first()
                            )
                ---------------->>>>>>>>>
     
     
                             models.User.objects.create(
                                        ...,
                                        user_group_id = 1
                            )
                    
                        2.在查表的时候,如果对象中有外键,那么外键就会当成对象被封装在QeurySet对象中,那么可以使用
                            obj.forginkey_obj
                       如果外键对象中还有外键,那么可以使用多次点,跨表查询
                            obj.forginkey_obj.forginkey_obj.forginkey_obj.forginkey_obj......
                    3.在查询时,只查询特定的某些项,可以用"_"获取关联的表字段
                            models.User.objects.all().values('nid','hostname','b_id','b__caption')            
                            caption为外键关联表中的字段
                                  首先这条语句获取的还是QuerySet的对象,对象中是列表,列表中的每一项才是字典
                                  HTML 渲染时 这中语句获取的对象只能这样取值     obj.b__caption    ,注意不要和前面的使用点混淆
     
                                   models.User.objects.all().values_list('nid','hostname','b_id','b__caption')
                             这种取值和前面一样  obj.1 obj.3 obj.4
     
     
  • 相关阅读:
    Flask第31课——include标签
    flask第30篇——宏macro和import标签
    HTML第三课——css盒子
    HTML第二课——css【2】
    HTML第二课——css
    HTML第一课——基础知识普及【2】
    转一篇数据库面试题
    自创建数字证书,安装到浏览器
    【转】Base64算法详解
    【转】二维码生成原理
  • 原文地址:https://www.cnblogs.com/cq146637/p/7806308.html
Copyright © 2011-2022 走看看