ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

day07 ORM中常用字段和参数

2021-11-29 10:31:41  阅读:213  来源: 互联网

标签:__ Book objects models day07 filter ORM 常用字 print


day07 ORM中常用字段和参数

今日内容

  • 常用字段
  • 关联字段
  • 测试环境准备
  • 查询关键字
  • 查看ORM内部SQL语句
  • 神奇的双下划线查询
  • 多表查询前提准备

常用字段

字段类型

AutoField
	int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列。

IntegerField
	一个整数类型,范围在 -2147483648 to 2147483647。(一般不用它来存手机号(位数也不够),直接用字符串存,)

CharField
	字符类型,必须提供max_length参数, max_length表示字符长度。
    
DateField
	日期字段,日期格式  YYYY-MM-DD,相当于Python中的datetime.date()实例。

DateTimeField
	日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例
    
#应用上面自定义的char类型
class Class(models.Model):
    id=models.AutoField(primary_key=True)
    title=models.CharField(max_length=32)
    class_name=FixCharField(max_length=16)
    gender_choice=((1,'男'),(2,'女'),(3,'保密'))
    gender=models.SmallIntegerField(choices=gender_choice,default=3)
    publish_time = models.DateField(auto_now=True,auto_now_add=True)

字段参数

null
	用于表示某个字段可以为空。

unique
	如果设置为unique=True 则该字段在此表中必须是唯一的 。

db_index
	如果db_index=True 则代表着为此字段设置索引。

default
	为该字段设置默认值。

DateField和DateTimeField # 年月日时分秒
    auto_now_add
        配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。

    auto_now
    配置上auto_now=True,每次更新数据记录的时候会更新该字段。

关系字段

ForeignKey:外键字段

# ForeignKey
    外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在 '一对多'中'多'的一方。
    ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系。
    
# 字段参数
to
	设置要关联的表

to_field
	设置要关联的表的字段

on_delete
	当删除关联表中的数据时,当前表与其关联的行的行为。

models.CASCADE
	删除关联数据,与之关联也删除

db_constraint
	是否在数据库中创建外键约束,默认为True。
    
def func():
    return 10

class MyModel(models.Model):
    user = models.ForeignKey(
        to="User",
        to_field="id",
        on_delete=models.SET(func)
    )

OneToOneField:外键字段

# 一对一字段。
    通常一对一字段用来扩展已有字段。(通俗的说就是一个人的所有信息不是放在一张表里面的,简单的信息一张表,隐私的信息另一张表,之间通过一对一外键关联)
    
# 字段参数
to
	设置要关联的表。

to_field
	设置要关联的字段。

on_delete
	当删除关联表中的数据时,当前表与其关联的行的行为。(参考上面的例子)

ORM必知必会13条

创建表

from django.db import models
class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=8,decimal_places=2)  # 浮点型
    publish_time = models.DateField(auto_now=True,auto_now_add=True)    # 年月日

# auto_now :每次修改数据会自动更新当前时间
# auto_now_add :仅在创建时自动更新时间,之后不是人为的修改,则时间一直不变

'''django自带的sqlite数据库功能非常的少 并且对日期格式不兼容'''
1.MySQL配置
2.数据库迁移命令
3.ORM查询关键字

测试环境准备

# 测试环境有两种
1.python console(pycharm下方自带)
2.py文件形式(参考manage.py前四行)  # 随便创建一个py文件,添加一下几行代码
import os
if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "py_dj7.settings")
    import django
    django.setup()
    # 在该代码的下方才可以正常测试django文件

常用字段

# 只要是QuerySet对象,就可以无限制的调用QuerySet对象方法

1、all():查询所有结果
	print(models.Book.objects.all())
    '''QuerySet支持正数索引,不支持负数索引'''

2、filter(): 它包含了与所给筛选条件相匹配的对象  # 支持索引取值
    print(models.Book.objects.filter(pk=1))    # fiter不加条件,也是查找所有
    print(models.Book.objects.filter(pk=1).first())   # 拿去第一个数值
    <QuerySet [<Book: 圣王>]>   # QuerySet  列表套数据对象
    '''
    ilter可以写多个条件,并且中间用逗号当成and关系
    pk相当于主键id,不在乎是id、uid等不同名称
    可以根据索引取值,推荐使用first()
    '''
    
3、first():返回第一个数据
	print(models.Book.objects.filter(pk=1).first())   # 圣王
    
4、last():返回最后一个数据
    print(models.Book.objects.all().last())   # 永生
    
4、 values(): values可以指定查询的字段,结果QuerySet  列表套字段,是一个可迭代的字典序列
    print(models.Book.objects.values('title'))
	<QuerySet [{'title': '圣王'}, {'title': '阳神'}, {'title': '遮天'}, {'title': '永生'}]>
    '''
    支持索引取值first()和last()、[0],但是不支持负数索引
    '''
    
5、values_list():它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
	print(models.Book.objects.values_list('title','price').first())
    ('圣王', Decimal('111.11'))
    
6、get():返回给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象不存在会抛出错误。
	res = models.Book.objects.get(pk=1)
    print(res,res.publish_time,res.price)  # 圣王 2021-11-01 111.11
    
7、exclude(): 取反
    print(models.Book.objects.exclude(pk=1))
    
8、order_by():排序(从小到大)
	print(models.Book.objects.order_by('price'))
    
9、reverse():反转,配合order_by
    print(models.Book.objects.order_by('price').reverse())
    
10、distinct():去重
    res = models.Book.objects.all().values('title','price')
    print(res.distinct())
    <QuerySet [<Book: 圣王>, <Book: 阳神>, <Book: 遮天>, <Book: 永生>, <Book: 圣王>]>
    '''注意:不加values会有id条件不同,索取去重的前提是把id过滤掉'''
    
11、count():计数
	print(models.Book.objects.count())  # 4个
    
12、exisit():如果QuerySet包含数据,就返回True,否则返回False
	print(models.Book.objects.filter(pk=10).exists())    # False
    
13、create():创建
    
14、update():修改

15、delete():删除

16、obj.save():保存

如何查看SQL语句

1、如果当前对象是queryset那么可以直接点query查找该对象内部SQL语句
    res = models.Book.objects.all()
    print(res.query)
    
2、settings.py配置文件(只要执行orm语句都会自动打印SQL语句)
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}

神奇的双下划线查询

# 双下划线查询:
    __gt:大于
    __lt:小于
    __gte:大于等于
    __lte:小于等于
    __in:在
    __range:范围
    __contains:包含
    __startswith:以什么开头
    __endswith:以什么结尾   
    _time__year:年
    _time__month:月 
    

案例1:查询书籍价格大于100的书
	print(models.Book.objects.filter(price__gt=100))   # __gt:大于
    
案例2:查询书籍价格小于100的书
	print(models.Book.objects.filter(price__lt=100))   # __lt:小于
    
案例3:查询书籍价格大于等于100的书
	print(models.Book.objects.filter(price__gte=100))  # __gte:大于等于
    
案例4:查询书籍价格小于等于800的书籍
	print(models.Book.objects.filter(price__lte=100))  # __lte:小于等于
    
案例5:查询书籍价格是92.12 或者35.60 或者111.11
	print(models.Book.objects.filter(price__in=["92.12","35.60","111.11"]))  #__in:在
    
案例6:查询书籍价格在100到200之间的书籍
	print(models.Book.objects.filter(price__range=(100,200)))   # __range:范围
    
案例7:查询书籍名称中包含字母p的书(区分大小写)
	print(models.Book.objects.filter(title__contains='p'))    # __contains:包含
    
案例8:查询书籍是否以...开头 ...结尾
    print(models.Book.objects.filter(title__startswith='a'))  # __startswith:以什么开头
    print(models.Book.objects.filter(title__endswith='a'))    # __endswith:以什么结尾
    
案例9:查询出版日期是2021的书(常用)
    print(models.Book.objects.filter(publish_time__year=2021))  # _time__year:年
    print(models.Book.objects.filter(publish_time__month=11))   # _time__month:月

标签:__,Book,objects,models,day07,filter,ORM,常用字,print
来源: https://www.cnblogs.com/1069943893com/p/15618237.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有