django的orm的增删改查

1.多表连接查询:直接通过外键的属性名进行查询(注意order__name__contains使用的是两个下划线)
class User(models.Model):
    name = models.CharField(_('Name'), max_length=50)
class Order(models.Model):
    user = models.ForeignKey(User)
Order.objects.filter(order__user__contains='serchcontent')
引申:反向查询,对外键设置了related_name之后通过该外键进行反向查询
class User(models.Model):
    name = models.CharField(_('Name'), max_length=50)
class Order(models.Model):
    user = models.ForeignKey(user,related_name="orderuser")
    price = models.CharField(_('Price'), max_length=50)
查询price:User.objects.filter(orderuser__price = "xxxxxx")

相当于User.orderuser.all()的升级版


2.条件设置

如果要使用的所有条件反向,可以将filter改为exclude(!=)

函数尾部加.distinct() :去重复 = SELECT DISTINCT

User.objects.filter(orderuser__price = "xxxxxx").distinct()

函数尾部加.order_by("排序的列") :对结果进行排序(个人更赞同使用models里设置orderby进行排序)= SELECT * from * ORDER BY xx

User.objects.filter(orderuser__price = "xxxxxx").order_by("name")正向排序
User.objects.filter(orderuser__price = "xxxxxx").order_by("-name")倒序

其余一些筛选设置:

__exact       精确等于 like 'aaa'
 __iexact    精确等于 忽略大小写 ilike 'aaa'
 __contains    包含 like '%aaa%'
 __icontains    包含 忽略大小写 ilike '%aaa%',但是对于sqlite来说,contains的作用效果等同于icontains。
__gt    大于
__gte    大于等于
__lt    小于
__lte    小于等于
__in     存在于一个list范围内
__startswith   以...开头
__istartswith   以...开头 忽略大小写
__endswith     以...结尾
__iendswith    以...结尾,忽略大小写
__range    在...范围内
__year       日期字段的年份
__month    日期字段的月份
__day        日期字段的日
__isnull   是否为空


例子:
>> q1 = Entry.objects.filter(headline__startswith="What")
>> q2 = q1.exclude(pub_date__gte=datetime.date.today())
>> q3 = q1.filter(pub_date__gte=datetime.date.today())
>>> q = q.filter(pub_date__lte=datetime.date.today())
>>> q = q.exclude(body_text__icontains="food")


即q1.filter(pub_date__gte=datetime.date.today())表示为时间>=now,q1.exclude(pub_date__gte=datetime.date.today())表示为<=now

使用filter之类代码返回的queryset,是可以之后再进行distinct、order_by等操作的,灵活使用

orm也是把这类代码转换成sql语句,通过connection.queries就可以查看本次connection使执行过的sql语句

queryset是类似list的,但是它并不是list,并不是list,并不是list(非常重要!)

但是可以用很多list的操作,比如len()、切片,也可以用迭代进行性能优化。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值