關聯關係欄位 (Relationship fields)
ForeignKey,ManyToManyField與OneToOneField分別在Model中定義多對一,多對多,一對一關係。
例如,一本書由一家出版社出版,一家出版社可以出版很多書。一本書由多位作者合寫,一個作者可以寫很多書。
class Author(models.Model):
name=models.CharField(max_length=20)
class Publisher(models.Model):
name=models.CharFiel Bookdmod.lengthsm(3);
name=models.CharField(max_length=20)
pub=models.ForeignKey(Publisher)
authors=models.ManyToManyField(Author)
model 建立關聯,就使用model 的名稱,而不是使用model 物件本身。
name=models.CharField(max_length=20)
集')authors=models.ManyToManyField('Author')
2.Model關聯自身
Model可以與自身做多對一關係
leader=models.ForeignKey('self',blank=True,null=True)
Model也可以與自身做多對多關係
class Person(models.Model):): ManyToManyField("self")
p1.save()
p2= Person()
p2.save()
p3.save()
p1.friends.add(p2,p3)
上述情況下,要找p3的朋友,不用找p3.person_setp3.person_set. all(),而直接用p3.friends.all()就可以了
如果想取消這種對稱關係,將symmetrical設為False
class Person2(models.Model):
friends=(models.ManyToyField "self",symmetrical=False)
反向名稱,用來從被關聯字段指向關聯關聯。
時,你必須明確指定反向名稱; 只有在你這麼做了之後, 某些特別語法 (some special syntax) 才能正常使用。
name=models.CharField(max_length=20)
pub=models.ForeignKey(Publisher,related_name='pub').Foreign )
這樣用Publisher或Author反向查詢Book時可以用related_name了:publisher1.pub.all()或author1.author.all()。 如果不想設定反向關係,設定related_name為'+'或以'+'結束。
user = models.ForeignKey(User, related_name='+')
如果有多個ManyToManyField指向同一個Model,這樣反向查詢FOO_set的時候就無法弄清楚是哪個ManyToManyField字段了,可以禁止反向關聯:
users = models.ManyToManyField(User, related_name='u+')
referents = models.ManyToManyField(User, related_name='ref+'): Django 使用ForeignKey欄位名稱+ "_id" 做為資料庫中的欄位名稱。在上面的例子中,BOOK model 對應的資料表中會有 一個 publisher_id 欄位。
你可以透過明確地指定 db_column 來改變該欄位的列名稱,不過,除非你想自定 義 SQL ,否則沒必要更改資料庫的列名稱。
意味著,你可能會看到類似 book_authors_9cdf4 這樣的表格名稱。你可以使用 db_table 選項手動指定中間表名稱。
name = models.CharField(max_length=128)
def ):name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, through='Membership')sel 含
class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, self.name
class Membership (models.Model):
person = models.ForeignKey(Person)
group = models.ForeignKey(Group)
date_joined = models.DateFielson()
這樣,就可以記錄某個person何時加入group了。
>>> paul = Person.objects.create(name="Paul McCartney")
>>> beatles = Group.objects.create (name="The Beatles")>>> m1 = Membership(person=ringo, group=beatles,
... date_joined=date(1962, 8, 16),
... invite_reason= "Nummered a newdreeded .")
>>> m1.save()
clear()還是可以使用的
當多對多關係關聯自身時,表中間的Foreign是可以指向同一個Model的,但是它們必須被看做ManyToManyField的兩邊,而不是對稱的,需要設定 symmetrical=False。
CASCADE:預設值,model物件會和ForeignKeyx一起被刪除
return User.objects.get_or_create(username='deleted')[0]
class MyModel(njels.Model):
getsmof努片))
DO_NOTHING:啥也不做。
如果為 True ,且作用於繼承自某個父 model 的子 model 上(這裡不能是延後繼承,父 model 必須真實存在 ),那麼該字段就會變成指向父類實例的引用(或者叫鏈接),
而不是像其他OneToOneField 那樣用於擴展父類並繼承父類屬性。
from django.db import models, transaction, IntegrityError
class Place(models.Model):
name = models.CharField(max_length=50)
m o. def __unicode__(self ):
return u"%s the place" % self.name
class Restaurant(models.Model):
place = models.OneToOneField(Placedog primrimy) primary_r.
serves_pizza = models .BooleanField()
def __unicode__(self):
return u"%s the restaurant" % self.place.name
class WlterKey(Fall) Wlmet(
name = models 。不是物件列表,而是單獨的物件:
>>> p1 = Place(name='Demon Dogs', address='944 W. Fullerton')
>>> p1.save()
>>> r = Restaurant(place=p1, serves_hot_dogs=True, serves_pizza=False)
>>> r.save()
>> (restaurant__place__name__startswith="Demon")
文章請關注PHP中文網(www.php.cn) !