Django Model 查询


== Model 查询 ==


class Blog(models.Model):    # 博客
    name = models.CharField(max_length=100)
    tagline = models.TextField()

class Author(models.Model):  # 作者
    name = models.CharField(max_length=50)
    email = models.EmailField()

class Entry(models.Model):   # 博客条目
    blog = models.ForeignKey(Blog)  # 一对多关系,Blog to Entry 一个博客包含多个条目
headline = models.CharField(max_length=255)
authors = models.ManyToManyField(Author) # 多对多关系,一个条目有多个作者,一个作者也可以有多个条目


OneToOneField   一对一
ForeignKey      一对多
ManyToManyField 多对多

- save() 创建(insert)或保存修改(update)


- ManyToManyField字段添加entry.authors.add(john)


- 获得对象(查询记录):通过Manager(objects)构建一个QuerySet(select...where...limit...)
- QuerySet API reference: https://docs.djangoproject.com/en/1.8/ref/models/querysets/#django.db.models.query.QuerySet
>>> all_entries = Entry.objects.all()
>>> one_entry = Entry.objects.get(pk=1)
>>> Entry.objects.filter(pub_date__year=2006)
>>> Entry.objects.exclude(pub_date__year=2006)
>>> Entry.objects.filter(headline__startswith='What').exclude(pub_date__gte=datetime.date.today())
>>> Entry.objects.all()[:5]
>>> Entry.objects.filter(field__lookuptype=value) # lookuptype 默认为exact
>>> Blog.objects.get(id__exact=14)  # Explicit form
>>> Blog.objects.get(id=14)         # __exact is implied
>>> Entry.objects.filter(blog_id=4) # 外键字段,字段名加后缀"_id",
raw() # 使用原始SQL语句查询
>>> Person.objects.raw('SELECT id, first_name, last_name, birth_date FROM myapp_person')
translations:
>>> name_map = {'first': 'first_name', 'last': 'last_name', 'bd': 'birth_date', 'pk': 'id'}
>>> Person.objects.raw('SELECT * FROM some_other_table', translations=name_map)
params:
>>> lname = 'Doe'
>>> Person.objects.raw('SELECT * FROM myapp_person WHERE last_name = %s', [lname])


- 跨越关系查询
>>> Entry.objects.filter(blog__name='Beatles Blog') # 使用关联字段名,有blog名为'Beatles Blog'的所有条目
>>> Blog.objects.filter(entry__headline__contains='Lennon') # 反向,条目标题包含'Lennon'的所有blog


- 查询中引用Model中其他字段,F() 表达式
>>> from django.db.models import F
>>> Entry.objects.filter(n_comments__gt=F('n_pingbacks'))


- 使用Q对象进行复杂查询
from django.db.models import Q
Q(question__startswith='What')
Q(question__startswith='Who') | Q(question__startswith='What')
Q(question__startswith='Who') | ~Q(pub_date__year=2005)
Poll.objects.get(Q(question__startswith='Who'), Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))) #多个参数之间是AND关系


- 关联对象
- One-to-many关系:ForeignKey
#返回关联的blog
>>> e = Entry.objects.get(id=2)
>>> e.blog 
#保存
>>> e = Entry.objects.get(id=2)
>>> e.blog = some_blog
>>> e.save()
#反向过滤
>>> 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()
- Many-to-many关系:ManyToManyField
- One-to-one关系:OneToOneField
class EntryDetail(models.Model):
    entry = models.OneToOneField(Entry)
    details = models.TextField()
ed = EntryDetail.objects.get(id=2)
ed.entry # Returns the related Entry object.
e = Entry.objects.get(id=2)
e.entrydetail # returns the related EntryDetail object
 
- 直接执行SQL语句
from django.db import connection
    cursor = connection.cursor()
cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz]) # cursor.execute(sql, [params])
cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz])
    row = cursor.fetchone()
cursor.execute("SELECT foo FROM bar WHERE baz = '30%%' AND id = %s", [self.id])









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章