字段类型 # 自增长 Auto = models.AutoField() BigAuto = models.BigAutoField() # 二进制 Binary = models.BinaryField() # 布尔型 Boolean = models.BooleanField() NullBoolean = models.NullBooleanField() # 整型 PositiveSmallInteger =
字段类型
# 自增长 Auto = models.AutoField() BigAuto = models.BigAutoField() # 二进制 Binary = models.BinaryField() # 布尔型 Boolean = models.BooleanField() NullBoolean = models.NullBooleanField() # 整型 PositiveSmallInteger = models.PositiveSmallIntegerField() #正整数 5个字节 SmallInteger = models.SmallIntegerField() # 整数 6个字节 PositiveInteger = models.PositiveIntegerField() # 正整数 10个字节 Integer = models.IntegerField() # 整数 11个字节 BigInteger = models.BigIntegerField() # 整数 20个字节 # 浮点型 Float = models.FloatField() Decimal = models.DecimalField() # 指定总位数和小数位数 # 字符串 Char = models.CharField() # 指定最大长度 数据库对应varchar Text = models.TextField() # 不限长度 数据库对应longtext # 时间日期类型 Date = models.DateField() DateTime = models.DateTimeField( Duration = models.DurationField() # 持续时间,数据表中为int,python中timedelta实现 # 其他字段 Email = models.EmailField() Image = models.ImageField() File = models.FileField() FilePath = models.FilePathField() URL = models.URLField() UUID = models.UUIDField() GenericIPAddress = models.GenericIPAddressField() # IPv4或者IPv6
字段参数
# 共有参数 db_column #字段名 primary_key #是否为主键 verbose_name #别名 unique #是否添加唯一约束 help_text #帮助信息 editable #是否可编辑 null #数据库是否可为空 blank #表单中是否可为空 db_index #是否添加索引 # 特殊参数 Decimal = models.DecimalField(max_digits=4, decimal_places=2) # 总共4位,其中小数点2位 11.22 16.14 Date = models.DateField(unique_for_date=True, auto_now=True) # 日期唯一 自动更新修改日期 DateTime = models.DateTimeField(unique_for_month=True, auto_now_add=True) # 月份唯一 自动更新添加日期 Char = models.CharField(max_length=100) # 最大长度 # 关系参数 one2one = models.OneToOneField(Test, related_name='one') # related_name 用于反向查询 """on_delete 当一个被外键关联的对象被删除时,Django将模仿on_delete参数定义的SQL约束执行相应的操作 如下6种操作 CASCADE: 模拟SQL语言中的ON DELETE CASCADE约束,将定义有外键的模型对象同时删除(该操作为当前版本Django-1.11默认操作) PROTECT: 阻止上面的删除操作,但是弹出ProtectedError异常 SET_NULL: 将外键字段设为null,只有当字段设置了null=True时,方可使用 SET_DEFAULT: 将外键字段设为默认值,只有当字段设置了default参数时,方可使用 DO_NOTHING: 什么也不做 SET(): 设置为一个传递给SET()的值或者一个回调函数的返回值,注意大小写 """ foreign1 = models.ForeignKey(A, on_delete=models.CASCADE) foreign2 = models.ForeignKey(A, on_delete=models.PROTECT) foreign3 = models.ForeignKey(A, on_delete=models.SET_NULL, null=True, blank=True) foreign4 = models.ForeignKey(A, on_delete=models.SET_DEFAULT, default=0) foreign5 = models.ForeignKey(A, on_delete=models.DO_NOTHING) foreign6 = models.ForeignKey(A, on_delete=models.SET)
元数据
# Model类中自带一个Meta子类用于定义模型元数据,元数据主要对数据表进行定义 db_table = 'address' # 表名称 ordering = ['pid'] # 排序 verbose_name = '省市县地址信息' # 数据表别名 verbose_name_plural = verbose_name # 复数别名 abstract = True # 只用于继承而不生成数据表 permissions = (('定义好的权限', '权限说明'),) class Task(models.Model): class Meta: #自定义权限 permissions = ( ("view_task", "Can see available tasks"), ("change_task_status", "Can change the status of tasks"), ("close_task", "Can remove a task by setting its status as closed"), ) #用户检查自定义权限 user.has_perm('app.view_task') managed = False # 是否纳入管理,False则不会生成表 unique_together = ('address', 'note') # 联合唯一键 app_label = 'courses' # INSTALLED_APPS中如果没有添加courses应用,这里需要指定 db_tablespace # 定义数据库表空间的名字
查询接口
Teacher.objects.all() Teacher.objects.get(nickname='Jack') Teacher.objects.filter(fans__gte=500) Teacher.objects.filter(fans__in=[666,123]) # 在列表内 Teacher.objects.filter(nickname__icontains='A') icontains # 大小写不敏感 Teacher.objects.all()[:1] # 切片 Teacher.objects.all().order_by('-fans') # 排序 Teacher.objects.filter(fans__gte=500).order_by('nickname') # 链式查询 str(Teacher.objects.filter(fans__gte=500).order_by('nickname').query) # 查看原生SQL Student.objects.all().exclude(nickname='A同学') # 排除 Student.objects.all().reverse() 反向排序 # models的Meta中需要添加ordering Student.objects.all().distinct() # 去重 Student.objects.all().extra(select={'name': 'nickname'}) # 取别名 Student.objects.all().defer() # 排除某些字段 Student.objects.all().only() # 只获取某些字段 Student.objects.all().values('nickname', 'hobby') # 获取字典形式的QuerySet 分组 Student.objects.all().values_list('nickname', 'hobby') # 获取元组形式的QuerySet 分组 Student.objects.all().values_list('nickname', flat=True) # 当只有一个字段时,flat=True可以将元组中的值直接放入列表中 Student.objects.dates('created_at', 'month', order='DESC') # 根据时期获取查询集 Student.objects.datetimes('created_at', 'month', order='DESC') # 根据时期获取查询集 p_240 = Course.objects.filter(price__gte=240) p_260 = Course.objects.filter(price__lte=260) p_240.union(p_260) # 并集 innodb只支持并集 p_240.intersection(p_260) # 交集 p_240.difference(p_260) # 差集 courses = Course.objects.all().select_related('teacher') # 一对一 多对一查询优化 students = Student.objects.all().prefetch_related('course') # 一对多 多对多查询优化 Teacher.objects.get(nick='Jack').course_set.all() # 反向查询 Course.objects.values('teacher').annotate(vol=Sum('volume')) # 聚合计数 Course.objects.values('teacher').annotate(pri=Avg('price')) # 聚合计数 get_or_create() Course.objects.first() Course.objects.last() Course.objects.earliest() # Meta中添加get_latest_by Course.objects.latest() # Meta中添加get_latest_by Course.objects.in_bulk(['课程1', '课程2']) create() bulk_create() update_or_create() update() Course.objects.filter(title='test').delete() Course.objects.filter(title='test').exists() Course.objects.count() Course.objects.aggregate(Max('price'),Min('price'), Avg('price'), Sum('volume')) #F对象和Q对象 #F对象:操作字段的数据 Course.objects.update(price=F('price') - 11) Course.objects.filter(volume__lte=F('price')*10) #Q对象:结合AND,OR,NOT,|,~,&实现复杂的查询 Course.objects.filter(Q(title__icontains='java') & Q(volume__gte=5000))