django orm

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") 	
	
	
	

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值