Query是如何工作的
Django QuerySet是懒执行的,只有访问到对应数据的时候,才会去访问数据库。另外如果你再次读取查询到的数据,将不会触发数据库的访问,而是直接从缓存获取。
比如
对1530条数据做for循环计数的速度是0.2~0.3s
而用count只需要0.007s左右
Django目前不提供外键或多对多的关系跨越多个数据库的支持。如果你使用路由器分割模型对不同的数据库,任何FOREIGNKEY和多对多关系的模型定义必须是单个数据库的内部。 复制模型数据获取model_object值的方式
model.var
model中定义了为IntegerField的属性取出来是int
将model_object转成字典
model.__dict__ 或者 model_to_dict(model)
复制模型数据
# 在主数据库创建一个订单副本 # id也会相应复制,但created_time和modified_time不会 order = Order.objects.using('qtr').last() OrderCopy.objects.create(**model_to_dict(order), project_id='qtr') 外键的反向引用Tag.objects.filter(project_tag__project_id=project_id)
ProjectTag表的tag字段外键到了Tag表的id字段,并且定义了related_name='project_tag'的反向引用,因此可以通过Tag Model的project_tag字段访问到ProjectTag Model。project_tag__project_id表示ProjectTag Model的project_id字段
Tag.objects.filter(user_tag__user_id=user_id)
UserTag表的tag字段外键到了Tag表的id字段,并且定义了related_name='user_tag'的反向引用。同时UserTag表的user字段外键到了User表,因此user_tag__user_id表示User的id字段
总之,外键的反向引用用两横
UpdateTag.objects.filter(id__in=ids).all().update(**update_data)
filter(id__in=ids)相当于where id in ids
如果过滤的结果是空集则不会执行更新
update_data是一个字典
利用Q构建复杂的查询条件 如何取数据表最后两条数据 Record.objects.order_by('-id')[:2][:2]会被翻译为LIMIT 2
关于这个语句的性能消耗: 总之就是消耗不大
获取指定列的数据values:返回一个dict
record = Record.objects.values('id','name').first() print(type(record)) # <class 'dict'>values_list: 返回一个tuple,设置flat=True可以在只选择一列的情况下返回不用tuple包裹的数据
# 取最后两条数据记录的svn版本 ClientVersion.objects.values_list('svn_version', flat=True).order_by('-id')[:2]若是过滤出了多行数据,返回的是queryset类型,可以用list()将其转为列表
获取上一条数据和下一条数据 # 本条 obj = Record.objects.get(name='test') # 上一条 pre_obj = Record.objects.filter(id__lt=obj.id).last() # 下一条 next_obj = Record.objects.filter(id__gt=obj.id).first() 不等于 User.objects.exclude(age=10) // 查询年龄不为10的用户 User.objects.exclude(age__in=[10, 20]) // 查询年龄不为在 [10, 20] 的用户 exact def test_exact(): query1 = Origin.objects.filter(origin_str='test') print(query1.query) query2 = Origin.objects.filter(origin_str__exact='test') print(query2.query) # 二者翻译成sql语句是一样的 # WHERE `translate_app_origin`.`origin_str` = test 筛选空django model从数据库中取字符串的时候会自动去掉字符实际内容两旁的空格
比如 queryset.filter(result='') 可以过滤出result=" "和result=""的条目
总之就是,没有把多个不同数据库中相同model过滤出来的queryset合并的办法
distinct如果出现错误:DISTINCT ON fields is not supported by this database backend
如果你用的Mysql数据库,那么distinct() 里面不要任何参数,参数应该写在 value 中去,如
language_list = items.values_list('language', flat=True).distinct() order by