Сохранение ManyToManyField и ForeignKey в Django - PullRequest
1 голос
/ 28 октября 2009

У меня есть следующие модели:

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()

У меня может быть некоторая опечатка здесь и там, но вышеприведенное работает отлично, но я просто не люблю сохранять объекты так много раз. Есть ли лучший способ создать объект «Пицца» с нуля, используя текущие модели выше?

Ответы [ 2 ]

3 голосов
/ 28 октября 2009

Вы можете использовать метод 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'))

Обратите внимание, что при определении пиццы ForeignKey в модели Price, Pizza может иметь более одного Price. Это то, что вы имели в виду? Определение цены ForeignKey в Pizza даст одну цену за пиццу.

2 голосов
/ 28 октября 2009

Невозможно сохранить внешний ключ без существующего объекта в базе данных. Django должен знать id, присвоенный стороннему объекту, прежде чем он сможет ссылаться на него.

Вы можете абстрагировать код так, что вы не увидите все функции save (), но они все равно должны появиться, прежде чем объект можно будет использовать в качестве внешнего ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...