常用数据类型
# https://docs.djangoproject.com/en/1.8/ref/models/fields/#field-types
BooleanField:布尔类型true/false
NullBooleanField:相当于设置了null=True的BooleanField
IntegerField:整形
CommaSeparatedIntegerField:逗号分隔的整形
CharField:max_length,必填
TextField:None
EmailField:None
GenericIPAddressField:存储IP地址
URLField:verify_exists(True),检查URL可用性
FileField:upload_to 可选
DateTimeField、DateField、TimeField:auto_now(True)可选,每次动作都会更新 / auto_now _add(True),可选,一次产生
ForeignKey:外键, 如果为空设置参数null=True, blank=True
自定义方法
# https://docs.djangoproject.com/en/1.8/topics/db/models/#overriding-predefined-model-methods
class Blog(models.Model): name = models.CharField(max_length=100) tagline = models.TextField() def save(self, *args, **kwargs): do_something() super(Blog, self).save(*args, **kwargs) # Call the "real" save() method. do_something_else() def get_name(self): return self.name
查询API
filter(**kwargs) 匹配条件 exclude(**kwargs) 不匹配条件 order_by(*fields) 排序 reverse() 反向排序 distinct() 去除重复记录 values(*fields) 可迭代的字典序列 values_list(*fields) 返回元组序列 all() 查询所有 raw(*args, **kwargs) 执行原生sql defer(*fields) 延后加载字段 only(*fields) 立即载入字段 using(alias) 使用数据库,多数据库时使用 select_for_update(nowait=False) 行锁定 get(**kwargs) 单个查询 create(**kwargs) 创建对象并保存 get_or_create(defaults=None,**kwargs) 查询不到就创建 defaults={'desc': 'new'} bulk_create(objs, batch_size=None) 批量创建 count() 对象数量 latest(field_name=None) 返回该字段最新的对象 exists() 是否包含数据 update() 更新数据 delete() 删除数据
Filter查询条件
__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
Q 与 F 查询
from django.db.models import F, Q
Q用于复杂的查询
and --> XX.objects.filter(Q(f=1),Q(f=2)) # f == 1 and f == 2 or --> XX.objects.filter(Q(f=1) | Q(f=2)) # f ==1 | f == 2 not --> XX.objects.filter(~Q(f=1),Q(f=2)) # f != 1 and f == 2
F 查询条件两个字段相等的值
Server.objects.filter(master_ip=F('backup_ip'))