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()、切片,也可以用迭代进行性能优化。