#内容回顾
ORM查询: 1. 基本查询: all() : queryset [(obj), obj,....] first : 查询第一行 obj last :查询最后一行 obj values: 查询指定的列 quertset[{name:'zekai', "age":12},....] values_list: quertset[('zekai', 12),....] 2. 高级查询: in: filter(id__in=[1,2,3]) not in: exclude(id__in=[1,2,3]) like %xxx%: filter(name__contains) like %xxx: filter(name__endswith) like xxx%: filter(name__startswith) between ... and : filter(id__range=[2,5]) limit: .all()[10:20] 分页 order by: .all().order_by('id') : asc '-id': desc .all().order_by('id', '-name') group by: .values('name').annotate(xx=Count('id')).filter(xx__lt=3) filter().values('name').annotate(xx=Count('id')).filter(xx__lt=3) only: 支取某一列的值, only('name') :id也会取出来 defer: 除了某几列之外的 所有 defer('id') : id也会取出来 using: 指定某一个数据库 count(): 总共多少行 filter(id__lt=3) and : filter(id=2, name='xxx') or: Q(Q(id=3) | Q(name='xxx')) & Q(id=3) F: F('age') + 1 raw: 原生SQL connection : 类似pymysql 3. 一对多: 正向查询: objs = models.xxx.objects.all() for obj in objs: obj.外键.name 反向查询: 表名小写_set.all() .values: models.xxx.objects.filter('ut__name') .values_list 4. 多对多: djagno: manytomanyfiled: 只创建两列 自己定制: 写第三张表 5. 删除: filter().delete() ps: 级联删除 ForeignKey(on_delete=models.CASCADE) CASCADE: 级联删除 默认 SET_NULL: 取消级联删除 6. update: filter。update(name='zekai')
##Django框架ORM一对一表操作
#1、列子: 用户表(母表): id name age 1 icon 18 薪水表(子表): id money us_id 1 2000 1 (只能出现一次) class UserInfo(models.Model): name = models.CharField(max_length=32) age = models.CharField(max_length=32) class Salary(models.Model): money = models.CharField(max_length=32) us = models.OneToOneField("UserInfo") #2、一对一新增操作和其他的基本没区别: # models.UserInfo.objects.create(name='icon',age=18) # models.Salary.objects.create(money=3000,us_id=1) #3、一对一查询(反向查询有区别): ### 查询: ## 正向查询(子表查母表): ### Django版本为1.11.22 :res.us.name ### Django版本为1.11.10 : res.母表表名小写.name res = models.Salary.objects.filter(money="3000").first() print(res.us.name) ### 反向查询(母表查子表) ### obj.子表小写.子表列名 : res.salary.money res = models.UserInfo.objects.filter(name='icon').first() print(res.salary.money)
##Django列类型(重点********)
#两种比较 mysql django tinyint 无 smallint(unsigned) SmallIntegerField (PositiveSmallIntegerField) #数字 int (unsigned)) IntegerField (PositiveIntegerField) mediumint 无 bigint(unsigned) BigIntegerField float FloatField decimal(5,2) : 200.23 DecimalField char 无 #字符串 varchar CharFiled text TextField #时间 datetime (2019-7-17 12:23:34) DateTimeField date (2019-7-17) DateField - 参数: max_length=32 null=True : 可以设置为null db_index=True : 设置索引 default : 设置默认值 unique : 设置唯一索引 db_column: 设置一个列名 unique_together: 联合唯一索引 index_together :普通联合索引 class Meta: unique_together = ( ('money', 'us_id'), .... ) index_together = ( ('money', '') .... )
#自定义char类型字段:因为django没有char类型,所以可以自定义
class MyCharField(models.Field):
def __init__(self,max_length,*args,**kwargs):
self.max_length = max_length
super().__init__(max_length=max_length,*args,**kwargs)
class MyCharField(models.Field):
def __init__(self,max_length,*args,**kwargs):
self.max_length = max_length
super().__init__(max_length=max_length,*args,**kwargs)
def db_type(self, connection):
return 'char(%s)'%self.max_length
return 'char(%s)'%self.max_length
##Django-amdin自带管理后台(了解即可)
djagno-admin: django自带的管理后台系统 命令生成: python3 manage.py createsuperuser 想要管理自己生成的表: admin.py: from app01 import models admin.site.register(models.UserInfo) django-admin中的列类型(一下的列类型只是在admin中起作用): EmailField(CharField): - 字符串类型,Django Admin以及ModelForm中提供验证机制 IPAddressField(Field) - 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制 GenericIPAddressField(Field) - 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6 - 参数: protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6" unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启刺功能,需要protocol="both" URLField(CharField) - 字符串类型,Django Admin以及ModelForm中提供验证 URL SlugField(CharField) - 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号) CommaSeparatedIntegerField(CharField) - 字符串类型,格式必须为逗号分割的数字 UUIDField(Field) - 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证 FileField(Field) djagno-admin中的参数 : verbose_name Admin中显示的字段名称 blank Admin中是否允许用户输入为空 editable Admin中是否可以编辑 help_text Admin中该字段的提示信息 choices Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作 choices = ( (1, '男'), (2, '女') ) gender = models.IntegerField(choices=chocies) id name gender (男女)