Django ORM Cookbook精选摘录(上)

Django ORM Cookbook是一本不错的关于Django进阶的英文书籍,里面回答了很多我们在利用Django开发Web APP过程中经常遇到的问题,还有许多值得推荐的技巧。小编我今天就做下搬运工,精选些内容分享给大家。

1. 使用qs.query方法快速生成SQL原生语句

>>> queryset = Events.objects.all()
>>> str(queryset.query)
SELECT "events_event"."id", "events_event"."epic_id",
    "events_event"."details", "events_event"."years_ago"
    FROM "events_event"
2. 使用Annotate方法快速查询数据表字段重复条目(比如重名)
>>> duplicates = User.objects.values(
    'first_name'
    ).annotate(name_count=Count('first_name')).filter(name_count__gt=1)
>>> duplicates
<QuerySet [{'first_name': 'John', 'name_count': 3}]>
3. 使用order_by('?').first()随机获取一个对象
def get_random_object():
    return Category.objects.order_by("?").first()4. 使用Lower函数对字符串进行不分大小写的排序
Django的order_by函数对字符串进行排序时默认是分大小写的,一般先排大写字符串,再排小写字符串,
如果希望不分大小写,需要将所有字符串转成小写后再排序。
>>> from django.db.models.functions import Lower
>>> User.objects.all().order_by(Lower('username')).values_list('username', flat=True)
<QuerySet ['Billy', 'John', 'johny', 'johny1', 'paul', 'Radha', 'Raghu', 'Ricky', 'rishab', 'Ritesh', 'sharukh', 'sohan', 'yash']>5. 使用qs.union合并两个字段不相等的查询集
Django的union方法仅限于合并两个字段相等的查询集,如果两个查询集字段不同时会报错。这时
可以我们先使用values_list提取相同字段后再进行合并。
Student.objects.all().values_list(
    "name", "gender"
).union(
Teacher.objects.all().values_list(
    "name", "gender"
))6. 将字符串转成日期格式后存储
>>> user = User.objects.get(id=1)
>>> date_str = "2018-03-11"
>>> from django.utils.dateparse import parse_date // 方法 1
>>> temp_date = parse_date(date_str)
>>> a1 = Article(headline="String converted to date", pub_date=temp_date, reporter=user)
>>> a1.save()
>>> a1.pub_date
datetime.date(2018, 3, 11)
>>> from datetime import datetime // 方法 2
>>> temp_date = datetime.strptime(date_str, "%Y-%m-%d").date()
>>> a2 = Article(headline="String converted to date way 2", pub_date=temp_date, reporter=user)
>>> a2.save()
>>> a2.pub_date
datetime.date(2018, 3, 11)今天就总结到这里,下次见。
大江狗

2019.12.12

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值