1. 程式人生 > >Django筆記 資料庫資料外來鍵 多對多關係訪問

Django筆記 資料庫資料外來鍵 多對多關係訪問

from django.db import models

# Create your models here.
class Publisher(models.Model):
    name = models.CharField(max_length=30,blank=True,null=True)
    address = models.CharField(max_length=50,blank=True,null=True)
    city = models.CharField(max_length=60,blank=True,null=True)
    state_province = models.CharField(max_length=50
,blank=True,null=True) webstie = models.URLField() def __unicode__(self): return self.name class Author(models.Model): first_name = models.CharField(max_length=30,blank=False,null=False) last_name = models.CharField(max_length=40,blank=False,null=False) def __unicode__(self)
:
return u'%s %s' % (self.first_name,self.last_name) class Book(models.Model): title = models.CharField(max_length=100,blank=False,null=False) authors = models.ManyToManyField(Author) publisher = models.ForeignKey(Publisher) publication_data = models.DateField(blank=False,null=False
) def __unicode__(self): return self.title

訪問外來鍵(Foreign Key)值
當你獲取一個ForeignKey 欄位時,你會得到相關的資料模型物件。 例如:

>>> b = Book.objects.get(id=50)
>>> b.publisher
<Publisher: Apress Publishing>
>>> b.publisher.website
u'http://www.apress.com/'

對於用ForeignKey 來定義的關係來說,在關係的另一端也能反向的追溯回來,只不過由於不對稱性的關係
而稍有不同。 通過一個publisher 物件,直接獲取 books ,用 publisher.book_set.all() ,如下:

>>> p = Publisher.objects.get(name='Apress Publishing')
>>> p.book_set.all()
[<Book: The Django Book>, <Book: Dive Into Python>, ...]

實際上,book_set 只是一個 QuerySet(參考第5章的介紹),所以它可以像QuerySet一樣,能實現資料過濾和分
切,例如:

>>> p = Publisher.objects.get(name='Apress Publishing')
>>> p.book_set.filter(name__icontains='django')
[<Book: The Django Book>, <Book: Pro Django>]

屬性名稱book_set是由模型名稱的小寫(如book)加_set組成的。

訪問多對多值(Many-to-Many Values)
多對多和外來鍵工作方式相同,只不過我們處理的是QuerySet而不是模型例項。 例如,這裡是如何檢視書籍的作者:

>>> b = Book.objects.get(id=50)
>>> b.authors.all()
[<Author: Adrian Holovaty>, <Author: Jacob Kaplan‐Moss>]
>>> b.authors.filter(first_name='Adrian')
[<Author: Adrian Holovaty>]
>>> b.authors.filter(first_name='Adam')
[]

反向查詢也可以。 要檢視一個作者的所有書籍,使用author.book_set ,就如這樣:

>>> a = Author.objects.get(first_name='Adrian', last_name='Holovaty')
>>> a.book_set.all()
[<Book: The Django Book>, <Book: Adrian's Other Book>]

這裡,就像使用 ForeignKey欄位一樣,屬性名book_set是在資料模型(model)名後追加_set。