django--orm grammar

__exact        精确等于 like 'aaa'__iexact    精确等于 忽略大小写 ilike'aaa'__contains    包含 like '%aaa%'__icontains    包含 忽略大小写 ilike '%aaa%',但是对于sqlite来说,contains的作用效果等同于icontains。

django database gammer

__gt    大于

__gte    大于等于

__lt    小于

__lte    小于等于

__in    存在于一个list范围内

__startswith  以...开头

__istartswith  以...开头 忽略大小写

__endswith    以...结尾

__iendswith    以...结尾,忽略大小写

__range    在...范围内

__year      日期字段的年份

__month    日期字段的月份

__day        日期字段的日

__isnull=True/False__isnull=True与 __exact=None的区别classBlog(models.Model):name = models.CharField(max_length=100)

tagline = models.TextField()def__unicode__(self):returnself.nameclassAuthor(models.Model):name = models.CharField(max_length=50)

email = models.EmailField()def__unicode__(self):returnself.nameclassEntry(models.Model):blog = models.ForeignKey(Blog)

headline = models.CharField(max_length=255)

body_text = models.TextField()

pub_date = models.DateTimeField()

authors = models.ManyToManyField(Author)def__unicode__(self):returnself.headline

这 是model,有blog,author,以及entry;其中entry分别与blog与author表关 联,entry与blog表是通过 外键(models.ForeignKey())相连,属于一对多的关系,即一个entry对应多个blog,entry与author是多对多的关系, 通过modles.ManyToManyField()实现。

一、插入数据库,用save()方法实现,如下:>>>frommysite.blog.modelsimportBlog>>>b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.')>>>b.save()

二、更新数据库,也用save()方法实现,如下:>>b5.name ='New name'>>b5.save()

保存外键和多对多关系的字段,如下例子:

更新外键字段和普通的字段一样,只要指定一个对象的正确类型。>>>cheese_blog = Blog.objects.get (name="Cheddar Talk")>>>entry.blog = cheese_blog>>>entry.save()

更新多对多字段时又一点不太一样,使用add()方法添加相关联的字段的值。>>joe = Author.objects.create(name="Joe")>>entry.authors.add(joe)

三、检索对象>>>Blog.objects

>>>b = Blog(name='Foo', tagline='Bar')>>>b.objectsTraceback:...AttributeError:"Manager isn't accessible via Blog instances."1、检索所有的对象>>>all_entries = Entry.objects.all()

使用all()方法返回数据库中的所有对象。2、检索特定的对象

使用以下两个方法:

fileter(**kwargs)

返回一个与参数匹配的QuerySet,相当于等于(=).

exclude(**kwargs)

返回一个与参数不匹配的QuerySet,相当于不等于(!=)。

Entry.objects.filter (pub_date__year=2006)

不使用Entry.objects.all().filter (pub_date__year=2006),虽然也能运行,all()最好再获取所有的对象时使用。

上面的例子等同于的sql语句:

slect *fromentry where pub_date_year='2006'链接过滤器:>>>Entry.objects.filter (...headline__startswith='What'...).exclude(...pub_date__gte=datetime.now()...).filter (...pub_date__gte=datetime(2005,1,1)...)

最后返回的QuerySet是headline like'What%'andput_date2005-01-01另外一种方法:>>q1 = Entry.objects.filter (headline__startswith="What")>>q2 = q1.exclude(pub_date__gte=datetime.now())>>q3 = q1.filter (pub_date__gte=datetime.now())

这种方法的好处是可以对q1进行重用。

QuerySet是延迟加载

只在使用的时候才会去访问数据库,如下:>>>q = Entry.objects.filter (headline__startswith="What")>>>q = q.filter (pub_date__lte=datetime.now())>>>q = q.exclude(body_text__icontains="food")>>>printq

在printq时才会访问数据库。

其他的QuerySet方法>>>Entry.objects.all()[:5]

这是查找前5个entry表里的数据>>>Entry.objects.all()[5:10]

这是查找从第5个到第10个之间的数据。>>>Entry.objects.all()[:10:2]

这是查询从第0个开始到第10个,步长为2的数据。>>>Entry.objects.order_by('headline')[0]

这是取按headline字段排序后的第一个对象。>>>Entry.objects.order_by('headline')[0:1].get ()

这和上面的等同的。>>>Entry.objects.filter (pub_date__lte='2006-01-01')

等同于SELECT * FROM blog_entry WHERE pub_date <='2006-01-01';>>>Entry.objects.get (headline__exact="Man bites dog")

等同于SELECT ... WHERE headline ='Man bites dog';>>>Blog.objects.get (id__exact=14)# Explicit form>>>Blog.objects.get (id=14)# __exact is implied这两种方式是等同的,都是查找id=14的对象。>>>Blog.objects.get (name__iexact="beatles blog")

查找name="beatles blog"的对象,不去饭大小写。

Entry.objects.get (headline__contains='Lennon')

等同于SELECT ... WHERE headline LIKE'%Lennon%';

startswith 等同于sql语句中的 name like'Lennon%',

endswith等同于sql语句中的 name like'%Lennon'.>>>Entry.objects.filter (blog__name__exact='Beatles Blog')

查找entry表中外键关系blog_name='Beatles Blog'的Entry对象。>>>Blog.objects.filter (entry__headline__contains='Lennon')

查找blog表中外键关系entry表中的headline字段中包含Lennon的blog数据。

Blog.objects.filter (entry__author__name='Lennon')

查找blog表中外键关系entry表中的author字段中包含Lennon的blog数据。

Blog.objects.filter (entry__author__name__isnull=True)

Blog.objects.filter (entry__author__isnull=False,entry__author__name__isnull=True)

查询的是author_name为null的值

Blog.objects.filter (entry__headline__contains='Lennon',entry__pub_date__year=2008)

Blog.objects.filter (entry__headline__contains='Lennon').filter (  entry__pub_date__year=2008)

这两种查询在某些情况下是相同的,某些情况下是不同的。第一种是限制所有的blog数据的,而第二种情况则是第一个filter 是

限制blog的,而第二个filter 则是限制entry的>>>Blog.objects.get (id__exact=14)# Explicit form>>>Blog.objects.get (id=14)# __exact is implied>>>Blog.objects.get (pk=14)# pk implies id__exact等同于select *fromwhere id=14# Get blogs entries with id 1, 4 and 7>>>Blog.objects.filter (pk__in=[1,4,7])

等同于select *fromwhere idin{1,4,7}# Get all blog entries with id > 14>>>Blog.objects.filter (pk__gt=14)

等同于select *fromid>14>>>Entry.objects.filter (blog__id__exact=3)# Explicit form>>>Entry.objects.filter (blog__id=3)# __exact is implied>>>Entry.objects.filter (blog__pk=3)# __pk implies __id__exact这三种情况是相同的>>>Entry.objects.filter (headline__contains='%')

等同于SELECT ... WHERE headline LIKE'%\%%';

CachingandQuerySets>>>print[e.headlineforeinEntry.objects.all()]>>>print[e.pub_dateforeinEntry.objects.all()]

应改写为:>>queryset = Poll.objects.all()>>>print[p.headlineforpinqueryset]# Evaluate the query set.>>>print[p.pub_dateforpinqueryset]# Re-use the cache from the evaluation.、这样利用缓存,减少访问数据库的次数。

四、用Q对象实现复杂的查询

Q(question__startswith='Who')| Q(question__startswith='What')

等同于WHERE question LIKE'Who%'OR question LIKE'What%'Poll.objects.get (

Q(question__startswith='Who'),

Q(pub_date=date(2005,5,2)) |Q(pub_date=date(2005,5,6))

)

等同于SELECT *frompolls WHERE question LIKE'Who%'AND (pub_date ='2005-05-02'OR pub_date ='2005-05-06')

Poll.objects.get (

Q(pub_date=date(2005,5,2))| Q(pub_date=date(2005,5,6)),

question__startswith='Who')

等同于Poll.objects.get (question__startswith='Who', Q(pub_date=date(2005,5,2)) |Q(pub_date=date(2005,5,6)))

五、比较对象>>>some_entry == other_entry>>>some_entry.id == other_entry.id

六、删除

Entry.objects.filter (pub_date__year=2005).delete()

b = Blog.objects.get (pk=1)# This will delete the Blog and all of its Entry objects.b.delete()

Entry.objects.all().delete()

删除所有

七、一次更新多个值# Update all the headlines with pub_date in 2007.Entry.objects.filter (pub_date__year=2007).update(headline='Everything is the same')>>>b = Blog.objects.get (pk=1)# Change every Entry so that it belongs to this Blog.>>>Entry.objects.all().update(blog=b)

如果用save()方法,必须一个一个进行保存,需要对其就行遍历,如下:foriteminmy_queryset:item.save()

关联对象

one-to-many>>>e = Entry.objects.get (id=2)>>>e.blog# Returns the related Blog object.>>>e = Entry.objects.get (id=2)>>>e.blog = some_blog>>>e.save()>>>e = Entry.objects.get (id=2)>>>e.blog =None>>>e.save()# "UPDATE blog_entry SET blog_id = NULL ...;">>>e = Entry.objects.get (id=2)>>>printe.blog# Hits the database to retrieve the associated Blog.>>>printe.blog# Doesn't hit the database; uses cached version.>>>e = Entry.objects.select_related().get (id=2)>>>printe.blog# Doesn't hit the database; uses cached version.>>>printe.blog# Doesn't hit the database; uses cached version>>>b = Blog.objects.get (id=1)>>>b.entry_set.all()# Returns all Entry objects related to Blog.# b.entry_set is a Manager that returns QuerySets.>>>b.entry_set.filter (headline__contains='Lennon')>>>b.entry_set.count()>>>b = Blog.objects.get (id=1)>>>b.entries.all()# Returns all Entry objects related to Blog.# b.entries is a Manager that returns QuerySets.>>>b.entries.filter (headline__contains='Lennon')>>>b.entries.count()

You cannot access a reverse ForeignKey Managerfromtheclass;itmustbeaccessedfromaninstance:>>>Blog.entry_set

add(obj1, obj2, ...)

Adds the specified model objects to the related object set.

create(**kwargs)

Creates a new object, saves itandputs itinthe related object set. Returns the newly created object.

remove(obj1, obj2, ...)

Removes the specified model objectsfromthe related object set.

clear()

Removes all objectsfromthe related object set.

many-to-many类型:

e = Entry.objects.get (id=3)

e.authors.all()# Returns all Author objects for this Entry.e.authors.count()

e.authors.filter (name__contains='John')

a = Author.objects.get (id=5)

a.entry_set.all()

# Returns all Entry objects for this Author.one-to-one 类型:

class EntryDetail(models.Model):

entry = models.OneToOneField(Entry)

details = models.TextField()

ed = EntryDetail.objects.get (id=2)

ed.entry

# Returns the related Entry object使用sql语句进行查询:

def my_custom_sql(self):

from django .db import connection

cursor = connection.cursor()

cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz])

row = cursor.fetchone()

return row

link:python--django database grammar - Bing- 的个人空间 - 开源中国社区

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容