zoukankan      html  css  js  c++  java
  • Django单表查询 常用字段

    一、常用字段和非常用字段

    # 常用字段
        -IntegerField   整数
        -AutoField 自增字段
        -BooleanField bool类型
        -CharField 字符串类型
        -DateField  日期字段,日期格式  YYYY-MM-DD,相当于Python中的datetime.date()实例。
        -DateTimeField  日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例
        -DecimalField 浮点类型
        -FileField   上传文件,本质是varchar
        -ImageField   图片,本质是varchar,继承了FileField
        -TextField   存大文本
        -EmailField   本质是varchar
    # 非常用字段
        -BigAutoField
        -SmallIntegerField   
        -PositiveSmallIntegerField
        -PositiveIntegerField
        -BigIntegerField
        
        
                'AutoField': 'integer AUTO_INCREMENT',
                'BigAutoField': 'bigint AUTO_INCREMENT',
                'BinaryField': 'longblob',
                'BooleanField': 'bool',
                'CharField': 'varchar(%(max_length)s)',
                'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
                'DateField': 'date',
                'DateTimeField': 'datetime',
                'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
                'DurationField': 'bigint',
                'FileField': 'varchar(%(max_length)s)',
                'FilePathField': 'varchar(%(max_length)s)',
                'FloatField': 'double precision',
                'IntegerField': 'integer',
                'BigIntegerField': 'bigint',
                'IPAddressField': 'char(15)',
                'GenericIPAddressField': 'char(39)',
                'NullBooleanField': 'bool',
                'OneToOneField': 'integer',
                'PositiveIntegerField': 'integer UNSIGNED',
                'PositiveSmallIntegerField': 'smallint UNSIGNED',
                'SlugField': 'varchar(%(max_length)s)',
                'SmallIntegerField': 'smallint',
                'TextField': 'longtext',
                'TimeField': 'time',
                'UUIDField': 'char(32)',
                    
    # 常用参数
        -null
        -max_length
        -default
        -primary_key
        -unique
        -db_index
        
        # 
        -choices:比较常用(后面再说)
        -blank: django admin里提交数据,限制
            
    # 元数据
        -必须记住的
        class Meta:
                # 表名
            db_table = "book"
            #联合索引
            index_together = [
                ("name", "publish"),
            ]
            # 联合唯一索引
            unique_together = (("name", "publish"),)
            
       -了解
            # admin中显示的表名称
            verbose_name='图书表'
            #verbose_name加s
            verbose_name_plural='图书表'

    二、打印原生sql

    1 配置文件粘贴
    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'console':{
                'level':'DEBUG',
                'class':'logging.StreamHandler',
            },
        },
        'loggers': {
            'django.db.backends': {
                'handlers': ['console'],
                'propagate': True,
                'level':'DEBUG',
            },
        }
    }

    三、查询表记录API

    # 1. get(**kwargs)
    # 1.1: 有参,参数为筛选条件
    # 1.2: 返回值为一个符合筛选条件的记录对象(有且只有一个),如果符合筛选条件的对象超过一个或者没有都会抛出错误。
    obj=Employee.objects.get(id=1)
    print(obj.name,obj.birth,obj.salary) #输出:Egon 1997-01-27 100.1
    
    # 2、first()
    # 2.1:无参
    # 2.2:返回查询出的第一个记录对象
    obj=Employee.objects.first() # 在表所有记录中取第一个
    print(obj.id,obj.name) # 输出:1 Egon
    
    # 3、last()
    # 3.1: 无参
    # 3.2: 返回查询出的最后一个记录对象
    obj = Employee.objects.last() # 在表所有记录中取最后一个
    print(obj.id, obj.name)  # 输出:9 Egon
    
    # 4、count():
    # 4.1:无参
    # 4.2:返回包含记录对象的总数量
    res = Employee.objects.count() # 统计表所有记录的个数
    print(res) # 输出:9
    
    # 注意:如果我们直接打印Employee的对象将没有任何有用的提示信息,我们可以在模型类中定义__str__来进行定制
    class Employee(models.Model):
        ......
        # 在原有的基础上新增代码如下
        def __str__(self):
            return "<%s:%s>" %(self.id,self.name)
    # 此时我们print(obj)显示的结果就是: <本条记录中id字段的值:本条记录中name字段的值>

    !!!强调!!!:下述方法查询的结果都有可能包含多个记录对象,为了存放查询出的多个记录对象,django的ORM自定义了一种数据类型Queryeset,所以下述方法的返回值均为QuerySet类型的对象,QuerySet对象中包含了查询出的多个记录对象

    # 1、filter(**kwargs):
    # 1.1:有参,参数为过滤条件
    # 1.2:返回值为QuerySet对象,QuerySet对象中包含了符合过滤条件的多个记录对象
    queryset_res=Employee.objects.filter(department='技术部')
    # print(queryset_res) # 输出: <QuerySet [<Employee: <2:Kevin>>, <Employee: <5:Jack>>, <Employee: <6:Robin>>]>
    
    # 2、exclude(**kwargs)
    # 2.1: 有参,参数为过滤条件
    # 2.2: 返回值为QuerySet对象,QuerySet对象中包含了不符合过滤条件的多个记录对象
    queryset_res=Employee.objects.exclude(department='技术部')
    
    # 3、all()
    # 3.1:无参
    # 3.2:返回值为QuerySet对象,QuerySet对象中包含了查询出的所有记录对象
    queryset_res = Employee.objects.all() # 查询出表中所有的记录对象
    
    # 4、order_by(*field):
    # 4.1:有参,参数为排序字段,可以指定多个字段,在字段1相同的情况下,可以按照字段2进行排序,以此类推,默认升序排列,在字段前加横杆代表降序排(如"-id")
    # 4.2:返回值为QuerySet对象,QuerySet对象中包含了排序好的记录对象
    queryset_res = Employee.objects.order_by("salary","-id") # 先按照salary字段升序排,如果salary相同则按照id字段降序排
    
    # 5、values(*field)
    # 5.1:有参,参数为字段名,可以指定多个字段
    # 5.2:返回值为QuerySet对象,QuerySet对象中包含的并不是一个个的记录对象,而上多个字典,字典的key即我们传入的字段名
    queryset_res = Employee.objects.values('id','name')
    print(queryset_res) # 输出:<QuerySet [{'id': 1, 'name': 'Egon'}, {'id': 2, 'name': 'Kevin'}, ......]>
    print(queryset_res[0]['name']) # 输出:Egon
    
    # 6、values_list(*field):
    # 6.1:有参,参数为字段名,可以指定多个字段
    # 6.2:返回值为QuerySet对象,QuerySet对象中包含的并不是一个个的记录对象,而上多个小元组,字典的key即我们传入的字段名
    queryset_res = Employee.objects.values_list('id','name')
    print(queryset_res) # 输出:<QuerySet [(1, 'Egon'), (2, 'Kevin'),), ......]>
    print(queryset_res[0][1]) # 输出:Egon

    四、基于双下划线的模糊查询

     1、删除记录

     # 删除的两种方式
        # 第一种:queryset的delete方法
        # res=models.Book.objects.all().delete()
        # print(res)
        # 第二种:对象自己的delete方法
        # book = models.Book.objects.all().filter(name='金瓶没1').first()
        # print(type(book))
        # res=book.delete()

    2、修改表记录

     #修改记录
        # 第一种:queryset的update方法
        # res=models.Book.objects.filter(publish='东京').update(name='金瓶没1')
        # print(res)
        # 第二种:对象自己的
        book = models.Book.objects.filter(name='xxx').last()
        book.name='asdfasd'
        book.save()

    五、python脚本中调用Django环境

    如果不想让Django项目通过游览器发送一个请求响应运行sql查询  就配置python脚本中调用Django环境  鼠标点点完成测试

    # 在脚本中调用djagno服务
    import os
    if __name__ == '__main__':
        #1  引入django配置文件
        os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'day67.settings')
        # 2 让djagno启动
        import django
        django.setup()
        # 3 使用表模型
        from app01 import models
        models.Book.objects.create(name='测试书籍',publish='xx出版社')

    六、配置时区和国际化问题

    setting.py中
    1 后台管理汉语问题
        LANGUAGE_CODE = 'zh-hans'  # 管理后台看到的就是中文
    2 时区问题(使用东八区)
        TIME_ZONE = 'Asia/Shanghai'
        USE_TZ = False

    七、配置管理后台的使用(Django admin)

    0 管理后台是django提供的可以快速对表进行增删查改操作
    
    1 创建一个后台管理账号
        python3 manage.py createsuperuser
        输入用户名
        输入邮箱(可以不填,敲回车)
        输入密码
        确认密码
        # 超级用户创建出来了,可以登录管理后台了
    2 admin中表中一行一行的数据显示我们定制的样子
        重写模型类的__str__方法

     blank参数作用

    1 需要把book表注册到admin中
        在app下的admin.py中写
        from app01 import models
        # 把book表注册一些,管理后台就能看到了
        admin.site.register(models.Book)
    2 可以快速的对book表进行增删查改操作
    每天逼着自己写点东西,终有一天会为自己的变化感动的。这是一个潜移默化的过程,每天坚持编编故事,自己不知不觉就会拥有故事人物的特质的。 Explicit is better than implicit.(清楚优于含糊)
  • 相关阅读:
    const 深悟理解
    深拷贝与浅拷贝深究
    结队开发-最大子数组
    软件工程个人作业02
    四则运算关于加括号的思路
    实践出真知-所谓"java没有指针",那叫做引用!
    写代码的好习惯—先构思
    团队合作
    阿超超的四则运算 想啊想啊
    Github+阿超运算
  • 原文地址:https://www.cnblogs.com/kylin5201314/p/13811775.html
Copyright © 2011-2022 走看看