定义:面向对象和关系型数据库的一种映射,通过操作对象的方式操作数据
对应关系:
导入: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_lengthsuper(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加sverbose_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.(title='菊花怪大战MJJ')
book_obj.pub
book_obj.pub.name
pub_obj = models.(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.(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.(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) (对象,对象)
ve(4,5)
ve(*models.Book.objects.filter(pk__in=[4,5]))
mjj.books.clear()
obj = ate(title='跟MJJ学前端',pub_id=1)book__obj = models.(pk=1)
obj = book__ate(name='taibai')
聚合
from app01 import models
from dels 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 dels 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 dels 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 transactiontry:with transaction.atomic():# 进行一系列的ORM操作models.ate(name='xxxxx')models.ate(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()
ute("""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)
转载于:.html
本文发布于:2024-02-08 19:39:15,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170739238968363.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |