Django 一對多,多對多關係解析

【轉】Django 一對多,多對多關係解析  

 
Django 的 ORM 有多種關係:一對一,多對一,多對多。
各自定義的方式爲 :
       一對一: OneToOneField
       多對一: ForeignKey
       多對多: ManyToManyField
上邊的描述太過數據而缺少人性化,咱們來更人性化一些:
       多個屬於一個,即 belong to :  ForeignKey,多個屬於一個
       一個有一個,即 has one: OneToOneField
       一個有不少個,即 has many:  lots of A belong to B 與 B has many A,在創建 ForeignKey 時,另外一個表會自動創建對應的關係
       一個既有不少個,又屬於不少個,即 has many and belong to : ManyToManyField,一樣只能在一個model類中說明,關聯表會自動創建。
 
訪問方式: 
如下代碼摘自 StackOverflow 用來講明訪問方式
 

Model Code

from django.db import models class Engine(models.Model): name = models.CharField(max_length=25) def __unicode__(self): return self.name class Car(models.Model): name = models.CharField(max_length=25) engine = models.OneToOneField(Engine) def __unicode__(self): return self.name class Engine2(models.Model): name = models.CharField(max_length=25) def __unicode__(self): return self.name class Car2(models.Model): name = models.CharField(max_length=25) engine = models.ForeignKey(Engine2, unique=True) def __unicode__(self): return self.name

OneToOneField Example

>>> from testapp.models import Car, Engine >>> c = Car.objects.get(name='Audi') >>> e = Engine.objects.get(name='Diesel') >>> e.car #engine 的model 定義中並無car,這個是自動生成的,用關聯表的類名小寫直接訪問 <Car: Audi> # 注意返回內容的不一樣

ForeignKey with unique=True Example

>>> from testapp.models import Car2, Engine2 >>> c2 = Car2.objects.get(name='Mazda') >>> e2 = Engine2.objects.get(name='Wankel') >>> e2.car2_set.all() # 在未定義的model中用關聯表類名小寫加"_set"來訪問,多對多也同樣 [<Car2: Mazda>] #注意返回內容的不一樣,這裏是一個QuerySet
 
如下內容摘自DjangoBook,僅供我的查詢使用:
 
 

 

from django.db import models

class Publisher(models.Model):
    name = models.CharField(max_length=30)
    address = models.CharField(max_length=50)
    city = models.CharField(max_length=60)
    state_province = models.CharField(max_length=30)
    country = models.CharField(max_length=50)
    website = models.URLField()

    def __unicode__(self):
        return self.name

class Author(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=40)
    email = models.EmailField()

    def __unicode__(self):
        return u'%s %s' % (self.first_name, self.last_name)

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField()

    def __unicode__(self):
        return self.title

如咱們在第5章的講解,獲取數據庫對象的特定字段的值只需直接使用屬性。 例如,要肯定ID爲50的書本的標題,咱們這樣作:php

 
 

 

>>> from mysite.books.models import Book
>>> b = Book.objects.get(id=50)
>>> b.title
u'The Django Book'

可是,在以前有一件咱們沒說起到的是表現爲ForeignKey 或 ManyToManyField的關聯對象字段,它們的做用稍有不一樣。web

 
 

 

訪問外鍵(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() ,以下:django

 
 

 

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

實際上,book_set 只是一個 QuerySet(參考第5章的介紹),因此它能夠像QuerySet同樣,能實現數據過濾和分切,例如:app

 
 

 

>>> 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組成的。ide

 
 

 

訪問多對多值(Many-to-Many Values)

 

多對多和外鍵工做方式相同,只不過咱們處理的是QuerySet而不是模型實例。 例如,這裏是如何查看書籍的做者:spa

 
 

 

>>> 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 ,就如這樣:code

 
 

 

>>> 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對象

相關文章
相關標籤/搜索