2013-01-05 62 views
0

我想保存A對象和B對象。 A擁有B的外鍵。 B有一個OneToOneField到A。有沒有辦法可以避免在每次保存之間重新分配變量?或者有更好的方法來做到這一點?Django:如何避免在每次保存時重新分配ForeignKey?

# The models a and b were created earlier in code 
# a.b = b Was already set earlier in code 
# b.a = a Was already set earlier in code 
with transaction.commit_on_success(): 
    a.save() # pk created for a 
    b.a = a # attach a.pk to b 
    b.save() # pk created for b 
    a.b = b # attach b.pk to a 
    a.save() # re-save a to database 

回答

1

「A對B有一個外鍵。B有一個一對一A字段給A.」我不認爲這是建立你的關係的方式。您可以將B設置爲A的外鍵,然後使用B.a_set.all()從B訪問A.

要從here中解釋,有以下模型定義,Book是帶有Publisher的一對多(ForeignKey)和帶有Author的多對多。 (該~~~~只是意味着該模型之間不相關的關係,其他的東西)

class Publisher(~~~~): 
    ~~~~ 

class Author(~~~~): 
    ~~~~ 

class Book(~~~~): 
    publisher = models.ForeignKey(Publisher) 
    authors = models.ManyToManyField(Author) 

然後,你可以從一個給定的書訪問出版商和作者,像這樣:

b = Book.objects.get(id=50) 
publisher1 = b.publisher # publisher object for a given book 
author_set = b.authors.all() # query set of authors for a given book 

,你可以做相反的關係(這在上面的模型中沒有明確定義)。

p = Publisher.objects.get(name='Apress Publishing') 
p.book_set.all() # query set of books for a given publisher 
publisher1.book_set.all() # set of books for the publisher from above. 
a = Author.objects.get(name="JK Rowling") 
a.book_set.all() # query set of books for a given author 

任何時候你更新你需要調用save()將其保存在數據庫中的對象領域,但你不應該需要這樣做之前重新分配ForeignKey的或任何其他領域。如果這不適合你,也許是因爲模特之間的時髦關係。我不是100%確定的,但我認爲對象獲得(新)主鍵的唯一時間是它第一次保存到數據庫,然後這是它的第一個包。

+0

你是對的,pk只是在模型第一次被保存時創建的(不幸的是,這並不意味着需要更少的編碼:()。我有一個OneToOneField的原因是爲了方便地跟蹤最後一個創建一個模型,如果我沒有OneToOneField,那麼我必須使用B的反向訪問,這需要每次搜索數據庫。 ' – Sepero

相關問題