django ORM


一、对数据库进行操作
首先需要导入models
from mytest.models import User

1.增-向User表中增加对象:
(1)User.objects.create(name="m",age=99)
(2)p= User(name="m", age=99)
p.save()
(3)p = User(name="m")
p.age = 9
p.save()
(4)Person.objects.get_or_create(name="m", age=9)
'''
这种方法是防止重复很好的方法,但是速度要相对慢些,
返回一个元组,第一个为Person对象,第二个为True或False,
新建时返回的是True, 已经存在时返回False.
'''
2.查-获取对象
#all
User.objects.all()#获取对象不止一个返回值类型为QuerySet
User.objects.all[5:10]#切片操作,获取索引5-10
#get
User.objects.get(name=name)#获取一个对象
#filter
User.objects.filter(name="abc")
# 等于Person.objects.filter(name__exact="abc") 名称严格等于 "abc" 的人
User.objects.filter(name__iexact="abc")
# 名称为 abc 但是不区分大小写
User.obojects.filter(name__contains="abc")
#name中含有abc的对象
User.obojects.filter(name__icontains="abc")
#name中含有abc,不区分大小写
User.ocjects.filter(name__regix="^abc")
#正则表达式查询
User.objects.filter(name__iregix="^abc")
#正则表达式查询且不分大小写
#exclude
User.objects.exclude(name__contains="abc")
#排除name中含有abc的User对象
User.objects.filter(name__contais="abc").exclude("23")
#name中含有abc的,但是排除age为23的
#order_by
User.objects.order_by("name","-age")#按照name排序,若name相同按age倒序
User.objects.order_by("?name")#按照name随机排序
#aggreate
使用aggregate()过滤器调用聚合函数,返回单个对象
聚合函数包括:Avg,Max,Min,Sum,Count
使用Count时,一般不需要 aggregate()过滤器,直接调用即可
被定义在django.db.models中
3.删
#获取到对象后通过‘.delete()’删除
4.改
#获取到对象后通过‘.’找到其属性直接修改,再'.save()'
#也可以直接.update(name=name)
------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------
#常用字段类型
V=models.CharField(max_length=None[, **options])    #varchar
V=models.EmailField([max_length=75, **options])    #varchar
V=models.URLField([verify_exists=True, max_length=200, **options])    #varchar
V=models.FileField(upload_to=None[, max_length=100, **options])    #varchar
#upload_to指定保存目录可带格式,
V=models.ImageField(upload_to=None[, height_field=None, width_field=None, max_length=100, **options])
V=models.IPAddressField([**options])    #varchar
V=models.FilePathField(path=None[, match=None, recursive=False, max_length=100, **options]) #varchar
V=models.SlugField([max_length=50, **options])    #varchar,标签,内含索引
V=models.CommaSeparatedIntegerField(max_length=None[, **options])    #varchar
V=models.IntegerField([**options])    #int
V=models.PositiveIntegerField([**options])    #int 正整数
V=models.SmallIntegerField([**options])    #smallint
V=models.PositiveSmallIntegerField([**options])    #smallint 正整数
V=models.AutoField(**options)    #int;在Django代码内是自增
V=models.DecimalField(max_digits=None, decimal_places=None[, **options])    #decimal
V=models.FloatField([**options])    #real
V=models.BooleanField(**options)    #boolean或bit
V=models.NullBooleanField([**options])    #bit字段上可以设置上null值
V=models.DateField([auto_now=False, auto_now_add=False, **options])    #date
#auto_now最后修改记录的日期;auto_now_add添加记录的日期
V=models.DateTimeField([auto_now=False, auto_now_add=False, **options])    #datetime
V=models.TimeField([auto_now=False, auto_now_add=False, **options])    #time
V=models.TextField([**options])    #text
V=models.XMLField(schema_path=None[, **options])    #text
--------------------------------------------------------------------------------------------------------
#关系字段类型
V=models.ForeignKey(othermodel[, **options])    #外键,关联其它模型,创建关联索引
V=models.ManyToManyField(othermodel[, **options])    #多对多,关联其它模型,创建关联表
V=models.OneToOneField(othermodel[, parent_link=False, **options])    #一对一,字段关联表属性

-----------------------------------------------------------------------------------------------------------------------
#字段选项
null:如果为True,表示允许为空,默认值是False

blank:如果为True,则该字段允许为空白,默认值是False????

对比:null是数据库范畴的概念,blank是表单验证范畴的

db_column:字段的名称,如果未指定,则使用属性的名称(只限于数据库表中的名字,操作数据库还是类属性的名字)


db_index:若值为True, 则在表中会为此字段创建索引,默认值是False(为了优化查询速度 )


default:默认值,这可以是值或可调用对象。如果可调用,则每次创建新对象时都会调用它。

primary_key:若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用

unique:如果为True, 这个字段在表中必须有唯一值,这个值不能重复,默认值是False

关系型字段类型:关联表中使用


-------------------------------------------------------------------------

#filter/exclude参数
__exact 精确等于 like 'aaa'
__iexact 精确等于 忽略大小写 ilike 'aaa'
__contains 包含 like '%aaa%'
__icontains 包含 忽略大小写 ilike '%aaa%',
__gt 大于
__gte 大于等于
__lt 小于
__lte 小于等于
__in 存在于一个list范围内
__startswith 以...开头
__istartswith 以...开头 忽略大小写
__endswith 以...结尾
__iendswith 以...结尾,忽略大小写
__range 在...范围内
__year 日期字段的年份
__month 日期字段的月份
__day 日期字段的日
__isnull=True/False
------------------------------------------------------------------------
#元选项
db_table = 'xxx'
修改表名为xxx

ordering = 'xxx'
按照指定字段xxx排序

verbose_name = 'xxx'
给模型类指定一个直观可读的信息xxx

verbose_name_plural = verbose_name
设置verbose_name的复数

abstract = True
设置模型类为一个基类

permissions = (('定义好的权限', '权限说明'),)
给数据库的表设置额外的权限

managed = False
是否按照django既定的规则来管理模型类

unique_together = ('address', 'note')
联合唯一键,约束

app_label = 'xxx'
定义模型类属于哪一个应用

db_tablespace
定义数据库表空间的名字


---------------------------------------------------------------------------
#manager
#默认情况下,Django为model 添加的manager的名字为objects。
----------------------------------------
F和Q对象

原文地址:https://www.cnblogs.com/mznsndy/p/11314265.html