2009-10-27 107 views
1
一個ForeignKey

我有以下型號:保存ManyToManyField和在Django

class City(models.Model): 
    name = models.CharField(max_length=100) 

class Pizza(models.Model): 
    name = models.CharField(max_length=100) 
    cities = models.ManyToManyField('City') 

class Price(models.Model): 
    cad = models.DecimalField() 
    usd = models.DecimalField() 
    pizza = models.ForeignKey(Pizza) 

我可以創建下面的代碼一個全新的比薩餅:

new_pizza = Pizza(name='Canadian') 
new_pizza.save() 
# I already calculated the following before, the syntax might not 
# be correct but that's how you see it from the shell 
new_pizza.cities = [<City: Toronto>, <City: Montreal>] 
new_pizza.save() 
new_price = Price(cad=Decimal('9.99'), usd=Decimal('8.99'), pizza=new_pizza.id) 
new_price.save() 

我可能有一些錯字這裏但上面的工作很好,但我不喜歡這麼多次保存對象。有沒有更好的方法從上面的當前模型從頭創建一個Pizza對象?

回答

3

您可以使用Model.objects.create方法,該方法創建一個新實例,將其保存並返回一個指向新對象的指針,以準備定義與其他實例的關係。

#create a new Pizza 
#There's no need to explicitly save the new Pizza instance 
new_pizza = Pizza.objects.create(name='Canadian') 

#Add Cities to Pizza 
#Here, Toronto and Montreal are City instances you created earlier 
#There's no need to save new_pizza after adding cities 
new_pizza.cities.add(Toronto, Montreal) 

#Create a new Price object for new_pizza 
#There's no need to explicitly save new_pizza or the new Price instance. 
new_pizza.price_set.create(usd=Decimal('8.99'),cad=Decimal('9.99')) 

注意,通過定義Price模型比薩ForeignKey的,一個Pizza可以有不止一個Price。這是你的意思嗎?在Pizza中定義一個價格ForeignKey將給每個比薩一個價格。

2

如果沒有對象首先存在於數據庫中,沒有辦法保存外鍵。 Django需要知道分配給異物的id才能引用它。

你可能會抽象出代碼,使得你不會看到所有的save(),但是它們仍然必須在對象可以被用作外鍵之前發生。