首页 > 其他分享 >django之模型层

django之模型层

时间:2022-12-14 22:14:23浏览次数:52  
标签:name models res 模型 django objects User print

目录

模型层

模型层前期准备

使用django ORM要注意

​ 1、django自带的sqlite3数据可对时间字段不敏感,有时候会展示错乱,所以我们习惯切换成常见的数据库比如MySQL。

​ 2、django ORM并不会自动帮我们创建库,所以需要提前准备好''djangoday01''

​ 3.id字段是自动添加的,如果想自定义主键,只需要在其中一个字段指定primary_key = True,如果Django发现你已经明确地设置了Field.primary_key,它将不会添加自动ID列。

  1. Django支持MySQL5.5及更高版本。

django测试某个功能层

​ 默认不允许单独测试某个py文件,如果想要测试某个py文件,一般事测试models.py文件

测试环境1:pycharm提供的python console(临时保存,不推荐使用)

测试环境2:自己搭建(自带的test或者自己创建的py文件)

1.拷贝manage.py前四行代码
2.自己再添加两行
	import django
    django.setup()

代码演示:

测试tests.py

# manage.py中拷贝前四行代码
import os
import sys
def main():
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djangoProject6.settings')
    # 手写两行
    import django
    django.setup()
	# 导入app01文件夹内models文件并 测试models文件内User运行
    from app01 import models
    models.User.objects.all()

models.py

class User(models.Model):
    name = models.CharField(max_length=32, verbose_name='用户名')
    age = models.IntegerField(verbose_name='年龄')
    register_time = models.DateTimeField(verbose_name='注册事件', auto_now_add=True)
    """
    DateField       : 年月日
    DateTimeField   : 年月日 时分秒
    
    两个重要参数
    auto_now        : 每次操作数据的时候 该字段会自动将当前时间更新 
    auto_now_add    : 在创建数据的时候会自动将当前创建时间记录下来 之后只要不人为的修改 那么就一直不变
    """

    def __str__(self):
        return '用户对象:%s' % self.name

image

切换MySQL数据库

1.提前终端创建好库djangoday01
2.将DATABASES的配置更改
	DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'djangoday01',
        'USER':'root',
        'PASSWORD':'123',
        'HOST':'127.0.0.1',
        'PORT':3306,
        'CHARSET':'utf8'

    }
}
3.连接MySQL库
4.makemigrations
5.migrate

如何查看django ORM 底层原理?

django ORM本质还是SQL语句。

1.如果有QuerySet对象,那么可以直接点query查看SQL语句

res =models.User.objects.filter(name='kimi')
print(res.query)
SELECT `app01_user`.`id`, `app01_user`.`name`, `app01_user`.`age`, `app01_user`.`register_time` FROM `app01_user` WHERE `app01_user`.`name` = kimi

结论:有些不是QuerySet对象,就不能通过点query的形式点出来,就只能使用通过的方法

2.如果想查看所有ORM底层的SQL语句,也可以直接在配置文件添加日志记录

res1 = models.User.objects.create(name='kimi',age=16)
print(res.query)  # 会报错

settings最后>>>拷贝代码放在settings

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

模型层之ORM常见关键字

create 描述
filter 创建数据并直接获取当前创建的数据对象
first/last 根据条件筛选数据 结果是QuerySet [数据对象1,数据对象2]
update 拿queryset里面第一个元素/拿queryset里面最后一个元素
delete 删除数据(批量删除)
all 查询所有数据 结果是QuerySet [数据对象1,数据对象2]
values 根据指定字段获取数据 结果是QuerySet [{}},{},{},{}]
values_list 根据指定字段获取数据 结果是QuerySet [(),(),(),()]
distinct 去重 数据一定要一模一样才可以 如果有主键肯定不行
order_by 根据指定条件排序 默认是升序 字段前面加负号就是降序
get 根据条件筛选数据并直接获取到数据对象 一旦条件不存在会直接报错 不建议使用
exclude 取反操作
reverse 颠倒顺序(被操作的对象必须是已经排过序的才可以)
count 统计结果集中数据的个数
exists 判断结果集中是否含有数据 如果有则返回True 没有则返回False

1.create 创建数据并直接获取当前创建的数据对象

res1 = models.User.objects.create(name='kimi',age=16)
print(res1)
res2 = models.User.objects.create(name='rose', age=18)
print(res2)
res3 = models.User.objects.create(name='jason', age=20)
print(res3)
res4 = models.User.objects.create(name='kiki', age=27)
print(res4)

2.filter() 根据条件筛选数据 结果是QuerySet [数据对象1,数据对象2]

res5 =models.User.objects.filter()
res6 =models.User.objects.filter(name='kimi')
res7 =models.User.objects.filter(name='kimi',age=16 )
print(res5)
print(res6)  # <QuerySet [<User: 用户对象:kimi>, <User: 用户对象:kimi>, <User: 用户对象:kimi>, <User: 用户对象:kimi>]>
print(res7)  # <QuerySet [<User: 用户对象:kimi>, <User: 用户对象:kimi>, <User: 用户对象:kimi>, <User: 用户对象:kimi>]>

3.first()/last() QuerySet支持索引取值但是只支持正数 并且orm不建议你使用索引


res8 =models.User.objects.filter()[1]
# res9=models.User.objects.filter(pk=100)[0]  # 数据不存在索引取值会报错
res10 =models.User.objects.filter(pk=100).first()  # 数据不存在不会报错而是返回None
res11 =models.User.objects.filter(pk=100).last()  # 数据不存在不会报错而是返回None
print(res8)  # 用户对象:kimi
# print(res9)
print(res10)  # None
print(res11)  # None

4.update() 更新数据(批量更新)

models.User.objects.filter().update()  # 批量更新
models.User.objects.filter(id=1).update(9)  # 单个删除

5.delete() 删除数据(批量删除)

models.User.objects.filter().delete()      批量删除
models.User.objects.filter(id=1).delete()  单个删除

6.all() 查询所有数据 结果是QuerySet [数据对象1,数据对象2]

  res = models.User.objects.all()

7.values() 根据指定字段获取数据 结果是QuerySet [{}},{},{},{}]

values()res=models.User.objects.all().values('name')  #结果是QuerySet [{'name': 'kimi'}},{'name': 'rose'},{},{}]
res=models.User.objects.filter().values()  #结果是QuerySet [[{'id': 2, 'name': 'kimi', 'age': 16,.....}]
res=models.User.objects.values()   # <QuerySet [{'id': 2, 'name': 'kimi', 'age': 16,

8.values_list() 根据指定字段获取数据 结果是QuerySet [(),(),(),()]

res=models.User.objects.all().values_list('name','age')  # <QuerySet [('kimi', 16), ('rose', 18), ('jason', 20), ('kiki', 27),...]

9.distinct() 去重 数据一定要一模一样才可以 如果有主键肯定不行

res = models.User.objects.values('name','age').distinct()

10.order_by() 根据指定条件排序 默认是升序 字段前面加负号就是降序

res = models.User.objects.all().order_by('age')

11.get() 根据条件筛选数据并直接获取到数据对象 一旦条件不存在会直接报错 不建议使用

res = models.User.objects.get(pk=1)
print(res)   # 用户对象:kimi
#res = models.User.objects.get(pk=100, name='kimi')
# print(res)  # 报错

12.exclude() 取反操作

res = models.User.objects.exclude(pk=2) 
print(res)   #<QuerySet [<User: 用户对象:rose>, <User: 用户对象:jason>, <User: 用户对象:kiki>]>

13.reverse() 颠倒顺序(被操作的对象必须是已经排过序的才可以)


# res = models.User.objects.all()
res = models.User.objects.all().order_by('age')  # 升序
res1 = models.User.objects.all().order_by('age').reverse()  # 返回升序之前
print(res, res1)

14.count() 统计结果集中数据的个数

res1 =models.User.objects.all().count()
print(res1)  # 4

15.exists() 判断结果集中是否含有数据 如果有则返回True 没有则返回False

# res=models.User.objects.all().exisrt()  报错
res1 = models.User.objects.filter(pk=100).exists()
    print(res1)  # False

方法总结

1、返回QuerySet对象的方法有
    all()
    filter()
    exclude()
    order_by()
    reverse()
    distinct()
2.特殊的QuerySet
    values()    # 返回一个可迭代的字典序列
    values_list()  # 返回一个可迭代的元组序列
3.返回具体对象的
    get()
    first()
    last()
4.返回布尔值的方法有
    exists()
5.返回数字的方法有count()
	count()

标签:name,models,res,模型,django,objects,User,print
From: https://www.cnblogs.com/zhanglanhua/p/16983764.html

相关文章

  • django 5 模板层补充与模型层基础
    今日内容详细目录今日内容详细模板层之标签自定义过滤器、标签及inclusion_tag(了解)模板的继承与导入模型层模型层之前期准备ORM常用关键字模板层之标签{%if条件1(可......
  • python之路49 模板层标签 自定义过滤器 模板继承、模型层准备、ORM部分操作
    模板层之标签{%if条件1(可以自己写也可以是用传递过来的数据)%}<p>周三了周三了</p>{%elif条件2(可以自己写也可以用传递过来的数据)%}<p>百日......
  • django5
    模板层之标签{%if条件1(可以自己写也可以用传递过来的数据)%}<p>今天又是周三了</p>{%elif条件2(可以自己写也可以用传递过来的数据)%}<p>百日......
  • 模板层之标签、自定义过滤器、标签及inclusion_tag(了解)、模板的继承与导入、模型层
    模板层之标签(类似于python流程控制)在django模板语法中写标签的时候,只需要写关键字然后tab键就会自动补全。1.if判断{%if条件%}#条件一般是模板语法传过来的数......
  • django模板层与模型层
    内容导航模板层之标签自定义过滤器、标签及inclusion_tag(了解)母版的继承与导入模型层之ORM常见关键字内容详细模板层之标签{%if条件1(可以自己写也可以用......
  • djando之模型层
    模型层之前期准备1.自带的sqlite3数据库对时间字段不敏感,有上海会展示错乱,所以我们习惯切换成常见的数据库入MySQLdjangoorm并不会自动帮你创建库,所以需要提前准备好2......
  • 评价模型 - 层次分析法
    应用场景:决策模型(通过赋权,然后利用加权值来进行决策)、给指标赋权准则层:先给这5个部分进行\(5\times5\)的赋权(比如,景色相比费用略微重要,赋成3),然后对这个矩阵进行求解,得......
  • django 06 模型层
    模型层使用准备#1.django自带的sqllite3对时间字段不敏感,所以使用mysql会更常见#2.单独测试django某个功能层"""django默认是不可以单独测试py文件的"""......
  • 模板层之标签、自定义模板语法、母版(模版)的继承与导入、模型层前期准备知识点、ORM常
    模板层之标签模板语法支持if判断(支持elif):{%if条件1(可以自己写也可以用传递过来的数据)%}<p>今天又是周三了</p>{%elif条件2(可以自己写也可以用传递过......
  • Django模板语法及常见ORM关键词
    昨日内容回顾路由分配将本来一层的路由匹配拆分成两层进行匹配,第一层由总路由进行匹配,分配给分路由匹配具体视图,这就是路由分类,通过路由分配可以更方便进行多人开发及......