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
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
當你獲取一個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
多對多和外鍵工做方式相同,只不過咱們處理的是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。對象