画布 1
Django
  如何查看Django ORM查询集的原生SQL
    str(queryset.query)
  如何在Django ORM中使用OR查询
    Q表达式如：filter(Q(condition)|Q(condition))
    查询集如：queryset1 | queryset2
  如何在Django ORM中使用AND查询
    filter(condition1,condition2...)
    queryset1 & queryset2
    filter(Q(condition) & Q(condition))
  如何在Django中使用子查询（内连接）
    Subquery
  如何选择同一查询集中的某些字段
    values：结果为字典列表
    values_list：结果为元祖列表
    only：和values一样，不过only多取了ID字段
  如何筛选没有任何文件的FileField字段
    FileField或ImageField存着文件或图片的路径，数据库层面和CharField一样
    查找没有文件的FileField：Model.objects.filter(Q(file='')|Q(file=None))
  如何在Django中执行JOIN操作
    objects.select_related('')
    双下划线
  如何使用Django ORM找到排行第二的记录
    排行第一：queryset.first()
    排行倒数第一：queryset.last()
    排行第几：使用切片,queryset[n]
  如何基于字段值比较标准来筛选字符集
    基于固定值筛选
      查询name以R开头：name__startswith='R'
    比较字段
      如first_name=last_name：last_name=F(first_name")
    计算并比较字段
      如first_name和last_name首字母相同：Model.objects.annotate(first=Substr('first_name',1,1),last=Substr('last_name',1,1).filter(last=F('first'))
    F表达式也可以和__gt、__lt以及其他表达式一起使用
  如何从数据集中找到独一无二的字段值
    查询值唯一的IP：Database.objects.values('ip').annotate(count_ip=Count('ip')).filter(count_ip=1)
    查询IP唯一的记录：Database.objects.filter(ip__in=[item['ip'] for item in Database.objects.values('ip').annotate(count_ip=Count('ip')).filter(count_ip=1)])
    获取所有IP并去重：Database.objects.values('ip').distinct()
  如何使用Q对象进行复杂查询
    对查询条件使用OR：Q(条件1)|Q(条件2)
    对查询条件使用AND：Q(条件1)&Q(条件2)、AND条件可不使用Q，直接在filter中写入条件就是AND，即queryset.filter(条件1,条件2)
    查询条件使用NOT：Q(条件1) &~Q(条件2)，也可以queryset.filter(条件1).exclude(条件2)
  如何在Django ORM中使用聚合查询
    如Max、Min、Avg、Sum、Count等
    统计表中的行数：Model.objects.all().aggregate(Count('id'))
    分组查询，按IP分组统计行数：Database.objects.values('ip').annotate(count=Count('ip'))
  如何复制一个现有的模型对象
    查询出对象，设置pk为None后保存
    model=Model.objects.get(pk=n)
model.pk=None
model.save()
  如何从模型中有效地选取一个随机对象
    Model.objects.order_by('?')，该方法会使用MySQL自带的order by RAND() 会比较慢，性能差
    随机生成ID再去查找：
max_id=Model.objects.all().aggregate(Max('id'))
pk_id=random.randint(1, max_id)
obj=Model.objects.get(id=pk_id)
如果数据库中ID不连续，可能会找不到数据，此时可循环知道找到数据
    max_id=Model.objects.all().aggregate(Max('id'))
while True:
pk_id=random.randint(1, max_id)
obj=Model.objects.filter(id=pk_id).first()
if obj:
break
  如何在查询集中使用任意数据库函数
    Django中并不包含所有的数据库函数，而且数据库函数也并不是每个数据库都一样
    查询Cluster中name字段前5位：
Cluster.objects.annotate(substr=Func(F'name',function='substring',template="%(function)s(%(expressions)s,1,5)"))
      substr：是经过函数后的字段别名
      F'name'：中name是函数要操作的字段
      function=‘substring’：substring是数据库中的函数
      "%(function)s(%(expressions)s,1,5)"): 1和5是函数所需要的参数，其他是固定表达
    可以直接将Func中的内容定义为一个函数：
class SubStr(Func):
function='substring'
template="%(function)s(%(expressions)s,1,5)"
这样可以像Max那样使用：
Cluster.objects.annotate(substr=SubStr(F'name'))
  如何一次创建多个对象
    Model.objects.bulk_create(对象列表,batch_size=n)
  如何查找具有重复字段值的列
    查询重复的IP：Database.objects.values('ip').annotate(count_ip=Count('ip')).filter(count_ip__gt=1)
    查询IP重复的记录：Database.objects.filter(ip__in=[item.ip for item in Database.objects.values('ip').annotate(count_ip=Count('ip')).filter(count_ip__gt=1)])
  如何在DJango ORM找那个使用NOT查询
    exclude(condition)
    filter(~Q(condition))
  如何从相同或者不同的模型类中联合查询两个查询集结果
    queryset1.union(queryset2)
    注意两个查询集的字段要一样
  如何确保只有一个对象被创建
    重写save方法，如果数据库中存在对象，则抛出异常
    class Origin(models.Model):
name = models.CharField(max_length=100)
def save(self,*args, **kwargs):
if self.__class.objects.count():
self.pk = self.__class__.objects.first().pk
super().save(*args, **kwargs)
  如何在保存模型时更新其他模型中的非规范化字段
    重写模型的save方法
    使用信号signal
    信号和重写，用哪个?
      字段依赖由自己控制，使用重写save方法
      字段依赖由第三方应用控制，使用信号signal
  如何使用Django ORM执行类似truncate的操作
    Model.objects.all().delete()：当数据量大时会较慢
    为模型实现一个名为truncate的类方法
@classmethod
def truncate(cls):
with conection.cursor() as cursor:
cursor.execute("TRUNCATE TABLE {0} CASCADE".format(cls._meta.db_table))
调用Model.truncate()即可删除表数据
  Django在对象创建和更新时，会引发哪些信号
    pre_init
    post_init
    pre_save
    post_save
    pre_delete
    post_delete
    信号与重写save()
      如果想其他人重写或定制对象的save行为，则应该抛出signals
      如果要接入一个无权限修改的应用中的save行为，则可以使用pre_save或post_save
      如果想定制自己的save行为，则可以重写save方法
  如何将字符串转化为datetime并存入数据库
    使用django.utils.parse_data
    使用datetime.strptime方法
  如何以升序或者降序的方式给查询集排序
    使用order_by('字段名')排序，默认升序
    在字段名前添加'-'表示降序排序
  如何以不区分大小写的方式排序查询集
    order_by方法排序区分大小写
    可以在字段名上添加Lower方法，不区分大小写：order_by(Lower('name'))
  如何给两个字段排序
    给多个字段排序可以在order_by中使用多个字段如：order_by('a','-b','c')
  如何给关联模型（使用外键）的字段排序
    使用双下划线即：order_by('a__b','c')
  如何给注解字段（即使用了函数的字段）排序
    如计算模型A中c的数量并按数量排序：A.objects.annotate(a_count=Count('a')).order_by('a_count')
  如何建立一对一的关系模型
    models.OntToOneField
  如何建立一对多的关系模型
    models.ForeignKey
  如何建立多对多的关系模型
    models.ManyToManyField
  如何在模型中包含自引用外键
    models.ForeignKey('self')
    models.ForeignKey('app.模型名')
  将已有的数据表转化为Django模型
    每个表一个模型文件：python manage.py inspectdb
    统一放到一个模型文件：python manage.py inspectdb > models.py
  如何为数据库视图添加模型
    在应用的数据库里创建视图：create view temp_user as select id, first_name from auth_user;
    在应用中创建与之对应的模型并使用managed=False和db_table="temp_user":
class TempUser(models.Model):
first_name = models.CharField(max_length=100)
class Meta:
managed = False
db_table="temp_user"
  如何创建可与任何实体相关联的通用模型（如类别或评论）
  如何制定模型的表名
    在模型的内部类Meta中使用db_table=‘表名’
  如何给模型字段制定列名
    在模型定义中使用db_column='列名'：a=models.CharField(max_length=225, db_name='column1')
  null=True和blank=True的区别
    两者默认均为False
    null=True在数据库中允许为NULL值
    blank=True在数据库中存储为空字符串
  如何使用uuid代替id作为主键
    id=models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
  如何在Django中使用slug字段提高代码可读性
  如何添加多个数据库到Django应用