天天看點

Django筆記 資料庫資料外鍵 多對多關系通路

from django.db import models

# Create your models here.
class Publisher(models.Model):
    name = models.CharField(max_length=,blank=True,null=True)
    address = models.CharField(max_length=,blank=True,null=True)
    city = models.CharField(max_length=,blank=True,null=True)
    state_province = models.CharField(max_length=,blank=True,null=True)
    webstie = models.URLField()

    def __unicode__(self):
        return self.name

class Author(models.Model):
    first_name = models.CharField(max_length=,blank=False,null=False)
    last_name = models.CharField(max_length=,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=,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=)
>>> 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=)
>>> 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。

參考:django官方文檔