2010-05-09 4 views
3

У меня есть два связанные модели (один ко многим) в моем Джанго приложении и когда я делаю что-то вроде этогоСохранение связанных объектов модели

ObjBlog = Blog() 
objBlog.name = 'test blog' 

objEntry1 = Entry() 
objEntry1.title = 'Entry one' 

objEntry2 = Entry() 
objEntry2.title = 'Entry Two' 

objBlog.entry_set.add(objEntry1) 
objBlog.entry_set.add(objEntry2) 

я получаю ошибку, которая говорит, что «нулевое значение в колонке, и это нарушает внешний ключ не является нулевым ограничением ".

Ни один из объектов моей модели не был сохранен. Должен ли я сохранять «objBlog», прежде чем я смогу установить записи? Я надеялся, что могу вызвать метод save на objBlog, чтобы сохранить все это.

ПРИМЕЧАНИЕ. Я не создаю механизм блога, и это всего лишь пример.

+2

+1 за Примечание. :) – TelegramSam

+0

Это может быть информативным https://docs.djangoproject.com/en/dev/ref/models/relations/#django.db.models.fields.related.RelatedManager.add –

ответ

0

Я бы предположил, что одна из ваших моделей имеет поле внешнего ключа, которое не может быть недействительным. Когда вы делаете objBlog.entry_set.add(objEntry1), django вызывает save() для каждого объекта.

Это как метод add выглядит следующим образом:

def add(self, *objs): 
    for obj in objs: 
     if not isinstance(obj, self.model): 
      raise TypeError("'%s' instance expected" % self.model._meta.object_name) 
     setattr(obj, rel_field.name, instance) 
     obj.save() 
add.alters_data = True 
+0

, поэтому мне нужно сохранить объект блога прежде чем я смогу сохранить объект ввода? – iJK

+0

Он автоматически сохраняется, как выглядят ваши модели? Django, вероятно, жалуется, потому что есть отношение FK к модели, отличной от «Blog» и «Entry», на одной или обеих из них, которая не может быть нулевой. Фактическая трассировка была бы полезной для предоставления фактической помощи или, по крайней мере, фактического исключения. –

+0

Сначала мне нужно было сохранить объект Blog. Думаю, я думал, что Django сначала сохранит объект Blog, а затем сохранит объекты Entry. Когда я говорю «save», я делаю objBlog.save(), а затем я делаю это objBlog.entry_set.add (objEntry). Теперь я знаю, что сначала должен сохранить родительский объект. – iJK

Смежные вопросы