对于重要数据都做逻辑删除,不做物理删除,实现方法是定义isDelete字段,类型为BooleanField,默认值为False
【字段类型概括】:
- AutoField:一个根据实际ID自动增长的IntegerField,通常不指定,如果不指定,一个主键字段将自动添加到模型中
- BooleanField:true/false 字段,此字段的默认表单控制是CheckboxInput
- NullBooleanField:支持null、true、false三种值
- CharField(max_length=字符长度):字符串,默认的表单样式是 TextInput
- TextField:大文本字段,一般超过4000使用,默认的表单控件是Textarea
- IntegerField:整数
- DecimalField(max_digits=None, decimal_places=None):使用python的Decimal实例表示的十进制浮点数
- DecimalField.max_digits:位数总数
- DecimalField.decimal_places:小数点后的数字位数
- FloatField:用Python的float实例来表示的浮点数
- DateField[auto_now=False, auto_now_add=False]):使用Python的datetime.date实例表示的日期
- 参数DateField.auto_now:每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false
- 参数DateField.auto_now_add:当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false
- 该字段默认对应的表单控件是一个TextInput. 在管理员站点添加了一个JavaScript写的日历控件,和一个“Today"的快捷按钮,包含了一个额外的invalid_date错误消息键
- auto_now_add, auto_now, and default 这些设置是相互排斥的,他们之间的任何组合将会发生错误的结果
- TimeField:使用Python的datetime.time实例表示的时间,参数同DateField
- DateTimeField:使用Python的datetime.datetime实例表示的日期和时间,参数同DateField
- FileField:一个上传文件的字段
- ImageField:继承了FileField的所有属性和方法,但对上传的对象进行校验,确保它是个有效的image
【字段参数约束选项】:通过字段选项,可以实现对字段的约束,在字段对象时通过关键字参数指定
- null:如果为True,Django 将空值以NULL 存储到数据库中,默认值是 False
- blank:如果为True,则该字段允许为空白,默认值是 False
- 对比:null是数据库范畴的概念,blank是表单验证证范畴的
- db_column:字段的名称,如果未指定,则使用模型类定义时的字段名称
- db_index:若值为 True, 则在表中会为此字段创建索引
- verbose_name:在admin后台显示时,字段名字会变成你指定的中文,而数据表中的字段不变
- default:默认值
- primary_key:若为 True, 则该字段会成为模型的主键字段
- unique:如果为 True, 这个字段在表中必须有唯一值
- choices:可以指定一个元组,那么在页面显示这个字段时文本框会变成下拉框的形式,看例子
class Pb(models.Model):
PFLX = (
(0, '标准配方'), 看红颜色的标注部分
(1, '比例配方'),
)
pbbh = models.CharField(primary_key=True, max_length=50, verbose_name='配方编号')
pbname = models.CharField(max_length=50, blank=True, null=True, verbose_name='配方名称')
pftype = models.IntegerField(blank=True, null=True, choices=PFLX, default=0, verbose_name='配方类型(0:标准配方;1:比例配方)')
在admin后台会这样显示
【数据表之间的关系】:关系的类型包括
ForeignKey:一对多,将字段定义在多的一端中
ManyToManyField:多对多,将字段定义在两端
OneToOneField:一对一,将字段定义在任意一端中
- 用一访问多:b.hero_set
- 用一访问一:b.h或h.b
- 用多访问一:h.h_book,这是访问到一方的对象,h.h_book_id,这是访问到一方的主键字段的值
【元选项】:
在模型类中可定义类class Meta:
db_table = ' ':定义数据表名称,如果不定义数据表的默认名称为数据库名字_模型类名字
verbose_name = '你好':在admin后台显示时,是中文
verbose_name_plural = '你好':将模型类的名字变成中文,注意是在admin后台里面,而不是数据库表里面的表名变成中文
【查询集】:
1,查询集表示从数据库中获取的对象集合
2,查询集可以含有零个、一个或多个过滤器
3,过滤器基于所给的参数限制查询的结果
4,从sql的角度,查询集和select语句等价,过滤器像where和limit子句
***查询集通过过滤器查询出结果后返回多个值时是返回一个列表 user = TxUser.objects.filter(pk=1)取对象是需要从列表里取出来user[0].u_name,返回单个值时就可以直接查user = TxUser.objects.get(pk=1)----user.u_name,注意一点是用get的话,如果没有值会报异常DoesNotExist
【过滤器】:返回查询集的方法叫做过滤器
all():返回所有对象,是一个列表
filter(字段=要查询的值):返回符合条件的对象,是一个列表,没有值时是个空列表
exclude(字段=要查询的值):返回符合条件相反的对象,是一个列表,没有值时是个空列表
order_by("字段"):对指定的字段进行正序排序,加“-”则为倒序,是一个列表
values():一个对象构成一个字典,然后构成一个列表返回
get(字段=要查询的值):返回单个满足条件的对象,如果没有值则会报异常
count():返回当前查询集对象的个数
first():返回当前查询集对象的第一个
last():返回当前查询集对象的最后一个
exists():判断查询集中是否有对象,有返回True,否则返回False
***注意!:filter(字段=查询的值,字段=查询的值) == filter(字段=查询的值).filter(字段=查询的值),exclude()同理
【字段的查询】:过滤器中的参数就是筛选查询,相当于where语句,语法:字段名称__比较运算符=值
exact:判等的比较运算符,如果没有写比较运算符,默认表示判等,例如:filter(id=1)就相当于filter(id__exact=1)
contains:包含的意思,例子:filter(b_name__contains='神'),把字段b_name包含'神'字的查询出来
startswith,endswith:以值开头或结尾,例子:filter(b_name__endswith='侣'),把值最后的字为"侣"的查询出来
isnull,isnotnull:是否为null,例子:filter(b_name__isnull=False),把值不为null的查询出来,True的话表示把为null的查询出来
in:查询列表时要用到,例子:l = [1,2,3,4,5],filter(id__in=l),按照l这个列表的元素去挨个查找,把有的返回过来,返回一个列表,我这里由于id只有一个1,所以返回id为1的对象
gt,gte,lt,lte:大于,大于等于,小于,小于等于,例子:filter(id__lt=3),把id的值小于三的查询出来
year,month,day,week,hour,minute,second:年,月,日,周_几?,时,分,秒,例子:filter(b_date__gt=date(1980,12,28)),把日期大于1980.12.28的查询出来
【多表关联查询:语法:模型类名字__字段名字__比较运算符=值】
例子:book.objects.filter(hero__h_name__contains='杨'),把英雄名字带‘杨’字的书查询出来
聚合函数
- 使用aggregate()函数返回聚合函数的值
- 函数:Avg,Count,Max,Min,Sum
from django.db.models import Max
maxDate = list.aggregate(Max('bpub_date'))
- count的一般用法:
count = list.count()
F对象
- 可以使用模型的字段A与字段B进行比较,如果A写在了等号的左边,则B出现在等号的右边,需要通过F对象构造
list.filter(bread__gte=F('bcommet'))
- django支持对F()对象使用算数运算
list.filter(bread__gte=F('bcommet') * 2)
- F()对象中还可以写作“模型类__列名”进行关联查询
list.filter(isDelete=F('heroinfo__isDelete'))
- 对于date/time字段,可与timedelta()进行运算
list.filter(bpub_date__lt=F('bpub_date') + timedelta(days=1))
Q对象
- 过滤器的方法中关键字参数查询,会合并为And进行
- 需要进行or查询,使用Q()对象
- Q对象(django.db.models.Q)用于封装一组关键字参数,这些关键字参数与“比较运算符”中的相同
from django.db.models import Q
list.filter(Q(pk_ _lt=6))
- Q对象可以使用&(and)、|(or)操作符组合起来
- 当操作符应用在两个Q对象时,会产生一个新的Q对象
list.filter(pk_ _lt=6).filter(bcommet_ _gt=10)
list.filter(Q(pk_ _lt=6) | Q(bcommet_ _gt=10))
- 使用~(not)操作符在Q对象前表示取反
list.filter(~Q(pk__lt=6))
- 可以使用&|~结合括号进行分组,构造做生意复杂的Q对象
- 过滤器函数可以传递一个或多个Q对象作为位置参数,如果有多个Q对象,这些参数的逻辑为and
- 过滤器函数可以混合使用Q对象和关键字参数,所有参数都将and在一起,Q对象必须位于关键字参数的前面