2009-10-27 104 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(),但是它们仍然必须在对象可以被用作外键之前发生。