2013-11-20 3 views
1

Так часто бывает важно иметь ForeignKey соединение, которое начинается с нуля и затем есть что-то add EdДжанго внешний ключ, начиная с ничего

вот мой model s

class Class(models.Model): 
    title = models.CharField(max_length=30) 
    threshold = models.PositiveIntegerField(validators=[MaxValueValidator 
     (100),MinValueValidator(60)]) 
    works = models.ForeignKey(Work,null=True) #blank=True also doesn't work 

поэтому я создать класс что не имеет Work, логически имеет смысл:

math = Class("math",90) 
math.save() 

теперь позволяет сказать, что мы имеем homework и quizzes, которые являются Work экземплярами:

math.works.add(homework,quizzes) 
#gives the following error 
AttributeError: 'NoneType' object has no attribute 'add' 

math.works явно пусто, чтобы начать, и что имеет смысл, но это не позволит мне добавить что-нибудь!

Как я могу запустить ForeignKey ни с чем, а затем уметь add?

+1

Либо у вас есть ваши отношения назад, либо вам нужны отношения «многие ко многим». Может ли данный экземпляр «Work» принадлежать более чем одному классу за раз? –

+0

Нет, «Работа» индивидуальна для каждого класса. Причиной этого является то, что домашняя работа может составлять 10% в одном классе и 20% в другой, поэтому экземпляр «Work» может принадлежать только одному классу. Раньше у меня было много-много отношений, и все сработало, но потом я понял, что у иностранца больше смысла. Таким образом, я все правильно отредактировал, и я не могу пройти эту ошибку. –

+0

ваш внешний ключ должен быть в рабочей модели, а не в классе, поскольку работа знает свой класс, но класс имеет много работ – alko

ответ

1

Мои два цента. Во-первых, я думаю, вы должны перенести свой иностранный ключ на класс работы не класса. Добавить() для manytomany поля See documentation

class work(models.Model): 
..... 
subject = models.ForeignKey(Class,null=True) 

Так что отношения строятся, как ваше намерение. домашняя работа, викторины, поскольку экземпляры рабочего класса оба связаны с математикой как экземпляр класса Class.

при попытке сохранить, выполните следующие действия:

>>> homework = work.objects.get(pk=1) 
>>> math = Class.objects.get(pk=1) 
>>> homework.subject = math 
>>> homework.save() 
>>> quizzes = work.objects.get(pk=2) 
>>> math = Class.objects.get(pk=1) 
>>> quizzes.subject = math 
>>> quizzes.save() 

Теперь вы можете получить всю работу для данного класса:

math = Class.objects.get(pk=1) 
math.work_set.all() 

вернет вам все экземпляры, которые связаны с математике, и в вашем случае это будет домашнее задание и викторины.

+1

вы 'd лучше не 'class = ...' – alko

+0

правильно! сохраненное ключевое слово..и исправит это. благодаря – John

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