0.
Django ORM用到三个类:Manager、QuerySet、Model。Manager定义表级方法(表级方法就是影响一条或多条记录的方法),
我们可以以models.Manager为父类,定义自己的manager,增加表级方法;QuerySet:Manager类的一些方法会返回QuerySet实例,
QuerySet是一个可遍历结构,包含一个或多个元素,每个元素都是一个Model 实例,它里面的方法也是表级方法,
前面说了,Django给我们提供了增加表级方法的途径,那就是自定义manager类,而不是自定义QuerySet类,一般的我们没有自定义QuerySet类的必要;
django.db.models模块中的Model类,我们定义表的model时,就是继承它,它的功能很强大,通过自定义model的instance可以获取外键实体等,
它的方法都是记录级方法(都是实例方法,貌似无类方法),不要在里面定义类方法,比如计算记录的总数,
查看所有记录,这些应该放在自定义的manager类中。以Django1.6为基础。
1.多表连接查询:感觉django太NX了。
'''
自定义文章归档model管理器
1.新加一个数据处理的方法
2.改变原有的queryset
'''
class ArticleManager(models.Manager):
def distinct_date(self):
distinct_date_list = []
date_list = self.values('date_publish')
for date in date_list:
date = date['date_publish'].strftime('%Y/%m')
if date not in distinct_date_list:
distinct_date_list.append(date)
return distinct_date_list
class A(models.Model):
name = models.CharField(u'名称')
date_publish = models.DateTimeField(auto_now_add=True,verbose_name='发布时间')
#课14 关联自定义manager 管理器
objects = ArticleManager()
class Meta:
verbose_name = '用户'
verbose_name_plural = verbose_name
ordering = ['-date_publish']
def __unicode__(self):
return self.name
class B(models.Model):
aa = models.ForeignKey(A)
B.objects.filter(aa__name__contains='searchtitle')
1.5 反向查询,补上记录1.5,感觉django太太太NX了。
class A(models.Model):
name = models.CharField(u'名称')
class B(models.Model):
aa = models.ForeignKey(A,related_name="FAN_set")
bb = models.CharField(u'名称')
查A: A.objects.filter(FAN__bb='XXXX'),都知道related_name的作用,A.FAN_set.all()是一组以A为外键的B实例,
可前面这样的用法是查询出所有(B.aa=A且B.bb=XXXX)的A实例,还可以通过__各种关系查找,很好用!!!
a = A.objects.get(name='pp')
a.FAN_set.filter(bb='XXX')
版权归作者所有,任何形式转载请联系作者。
作者:petanne(来自豆瓣)
来源:https://www.douban.com/note/301166150/
2.条件选取querySet的时候,filter表示=,exclude表示!=。
querySet.distinct() 去重复
__exact 精确等于 like 'aaa'
__iexact 精确等于 忽略大小写 ilike 'aaa'
__contains 包含 like '%aaa%'
__icontains 包含 忽略大小写 ilike '%aaa%',但是对于sqlite来说,contains的作用效果等同于icontains。
__startswith 以...开头
__istartswith 以...开头 忽略大小写
__endswith 以...结尾
__iendswith 以...结尾,忽略大小写
__gt 大于
__gte 大于等于
__lt 小于
__lte 小于等于
__in 存在于一个list范围内
__range 在...范围内 ,对应于between and
__year 日期字段的年份
__month 日期字段的月份
__day 日期字段的日
__isnull=True/False
例子:
Person.objects.all()[:10] #切片操作,获取10个人,不支持负索引,切片可以节约内存
Person.objects.filter(name="abc") # 等于(name__exact="abc") 名称严格等于 "abc" 的人 ,name__iexact
Person.objects.filter(name__contains="abc") # 名称中包含 "abc"的人 ,name__icontains
Person.objects.filter(name__regex="^abc") # 正则表达式查询 ,name__iregex
Person.objects.exclude(name__contains="WZ") # exclude排除包含 WZ 的Person对象
Person.objects.exclude(name__in=iterable) #对应not in (iterable)是可迭代对象
Person.objects.filter(name__contains="abc").exclude(age=23) # 找出名称含有abc, 但是排除年龄是23岁的
Person.objects.all()[5:10] #对应于limit
3.在django models中取得一个字段的distinct值
http://www.manongjc.com/article/941.html
就是select distinct xxx from table_name ...这样的功能
很简单,代码如下
xxxx.objects.values("field_name").distinct()
#或者
xxxx.objects.distinct().values("field_name")