发布于2019-08-07 11:10 阅读(1285) 评论(0) 点赞(4) 收藏(4)
定义:面向对象和关系型数据库的一种映射,通过操作对象的方式操作数据
对应关系:
导入:from app01 import models
查:
增:
删:
改:
常用字段
YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]
,相当于Python中的datetime.datetime的实例自定义字段
class MyCharField(models.Field):
"""
自定义的char类型的字段类
"""
def __init__(self, max_length, *args, **kwargs):
self.max_length = max_length
super(MyCharField, self).__init__(max_length=max_length, *args, **kwargs)
def db_type(self, connection):
"""
限定生成数据库表的字段类型为char,长度为max_length指定的值
"""
return 'char(%s)' % self.max_length
class Class(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=25)
# 使用自定义的char类型的字段
cname = MyCharField(max_length=25)
在表对于的类中写入一个类Meta
class UserInfo(models.Model):
nid = models.AutoField(primary_key=True)
username = models.CharField(max_length=32)
class Meta:
# 数据库中生成的表名称 默认 app名称 + 下划线 + 类名
db_table = "table_name"
# admin中显示的表名称
verbose_name = '个人信息'
# verbose_name加s
verbose_name_plural = '所有用户信息'
# 联合索引
index_together = [
("pub_date", "deadline"), # 应为两个存在的字段
]
# 联合唯一索引
unique_together = (("driver", "restaurant"),) # 应为两个存在的字段
总结:
# 返回的是queryset对象的
all()
filter()
exclude()
values()
values_list()
order_by()
reverse()
distinct()
# 返回的是单个对象的
get()
first()
last()
# 返回的是数字的
count()
# 返回的是布尔值的
exists()
基于对象的查询
book_obj = models.Book.objects.get(title='菊花怪大战MJJ')
book_obj.pub
book_obj.pub.name
pub_obj = models.Publisher.objects.get(pk=1)
# 没有指定related_name,使用类名小写_set
pub_obj.book_set.all()
# 指定related_name='books'
pub_obj.books.all()
基于字段的查询
# 查询老男孩出版的书
ret = models.Book.objects.filter(pub__name='老男孩出版社')
# 查询出版菊花怪大战MJJ的出版社
# 没有指定related_name,使用类名的小写
ret= models.Publisher.objects.filter(book__title='菊花怪大战MJJ')
# related_name='books'
ret= models.Publisher.objects.filter(books__title='菊花怪大战MJJ')
# related_query_name='xxx'
ret= models.Publisher.objects.filter(xxx__title='菊花怪大战MJJ')
基于对象的查询
mjj = models.Author.objects.get(pk=1)
mjj.books # 关系管理对象
mjj.books.all()
book_obj = models.Book.objects.filter(title='桃花侠大战菊花怪').first()
# 不指定related_name
book_obj.author_set # 关系管理对象
book_obj.author_set.all()
# 指定related_name='authors'
book_obj.authors # 关系管理对象
book_obj.authors.all()
基于字段的查询
ret = models.Author.objects.filter(books__title='菊花怪大战MJJ')
# 不指定related_name
ret = models.Book.objects.filter(author__name='MJJ')
# 指定related_name='authors'
ret = models.Book.objects.filter(authors__name='MJJ')
# 指定related_query_name='xxx'
ret = models.Book.objects.filter(xxx__name='MJJ')
关系管理对象的方法
mjj = models.Author.objects.get(pk=1)
mjj.books.all()
# set() [id,id] [对象,对象]
mjj.books.set([1,2])
mjj.books.set(models.Book.objects.filter(pk__in=[1,2,3]))
# add (id,id) (对象,对象)
mjj.books.add(4,5)
mjj.books.add(*models.Book.objects.filter(pk__in=[4,5]))
# remove (id,id) (对象,对象)
mjj.books.remove(4,5)
mjj.books.remove(*models.Book.objects.filter(pk__in=[4,5]))
mjj.books.clear()
obj = mjj.books.create(title='跟MJJ学前端',pub_id=1)
book__obj = models.Book.objects.get(pk=1)
obj = book__obj.authors.create(name='taibai')
聚合
from app01 import models
from django.db.models import Max, Min, Avg, Sum, Count
# 为聚合值指定名称,注意关键字传参要在位置传参后面
ret = models.Book.objects.filter(pk__gt=3).aggregate(Max('price'),avg=Avg('price'))
print(ret)
分组
# 统计每一本书的作者个数,annotate:注释
ret = models.Book.objects.annotate(count=Count('author'))
# 统计出每个出版社的最便宜的书的价格
# 方式一
ret = models.Publisher.objects.annotate(Min('book__price')).values()
# 方式二:objects后面接values,就是按字段分组,相当于分组条件
ret = models.Book.objects.values('pub_id').annotate(min=Min('price'))
F查询
from django.db.models import F
# 比较两个字段的值
ret=models.Book.objects.filter(sale__gt=F('kucun'))
# 只更新sale字段
models.Book.objects.all().update(sale=100)
# 取某个字段的值进行操作
models.Book.objects.all().update(sale=F('sale')*2+10)
Q查询
from django.db.models import Q
ret = models.Book.objects.filter(~Q(Q(pk__gt=3) | Q(pk__lt=2)) & Q(price__gt=50))
print(ret)
使用try进行回滚时,必须把try写在with的外面,否则无法回滚
from django.db import transaction
try:
with transaction.atomic():
# 进行一系列的ORM操作
models.Publisher.objects.create(name='xxxxx')
models.Publisher.objects.create(name='xxx22')
except Exception as e :
print(e)
Django ORM执行原生SQL
# 执行原生SQL
# 更高灵活度的方式执行原生SQL语句
from django.db import connection, connections
cursor = connection.cursor()
cursor = connections['default'].cursor()
cursor.execute("""SELECT * from auth_user where id = %s""", [1])
row = cursor.fetchone()
Django终端打印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',
},
}
}
在Python中脚本中调用Django环境
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_practice.settings")
# orm_practice.settings表示当前项目的settings.py,orm_practice是当前项目名称
import django
django.setup()
from app01 import models
# 再继续写要执行的语句,例如
books = models.Book.objects.all()
print(books)
作者:齐天大圣
链接:https://www.pythonheidong.com/blog/article/10202/16f72d90d7951f4edf78/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!