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









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