我有以下型号:
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对象?
答案 0 :(得分: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将为每个Pizza提供一个价格。
答案 1 :(得分:2)
如果没有首先存在于数据库中的对象,则无法保存外键。 Django需要知道分配给异物的id
才能引用它。
你可能会抽象代码,这样你就不会看到所有的save(),但是在将对象用作外键之前它们仍然必须发生。