2016-03-06 1 views
2

Я совершенно новичок в django и раньше был php-кодером, поэтому, пожалуйста, несите меня, если я тупой. У меня есть три модели, определенные в моем приложении, Понимание, Вопрос, Ответ. Каждое понимание имеет несколько вопросов и ответов, определенных как «inline» в модели «Понимание». Вопросы вводятся непосредственно администратором, но ответы автоматически добавляются из понимания. То, что я хочу достичь, состоит в том, чтобы разделить понимание на предложения и добавить каждое предложение в качестве объекта ответа с помощью foreignkey текущего понимания. Я пытаюсь переопределить метод save в модели Comprehension. Но когда я нажимаю «Сохранить», он дает ошибку экземпляраСоздайте еще один объект модели в django admin внутри цикла for

Cannot assign "23L": "Answer.ComprehensionAnswer" must be a "Comprehension" instance. 

Как назначить/создать и экземпляр здесь? или я следую неправильному подходу. Если да, то любезно направляйте меня к правильному подходу.

Ниже приведены содержимое models.py

class Question(models.Model): 
    QuestionText = models.CharField(max_length=500, verbose_name='Question Text') 
    QuestionTypeID = models.ManyToManyField(QuestionType, verbose_name='Question Type') 
    ComprehensionQuestion = models.ForeignKey(Comprehension, verbose_name='comprehension') 
    QuestionRemarks = models.CharField(max_length=500, verbose_name='remarks', null=True, blank=True) 
    LastUpdate = models.DateTimeField(auto_now=True) 
    def __unicode__(self): 
     return self.QuestionText 
    def was_published_recently(self): 
     return self.LastUpdate >= timezone.now() - datetime.timedelta(1) 

class Answer(models.Model): 
    AnswerText = models.CharField(max_length=500, verbose_name='Answer Text') 
    AnswerTypeID = models.ManyToManyField(AnswerType, verbose_name='Answer Type') 
    ComprehensionAnswer = models.ForeignKey(Comprehension, verbose_name='Comprehension', null=True, blank=True) 
    AnswerRemarks = models.CharField(max_length=500, verbose_name='Remarks') 
    LastUpdate = models.DateTimeField(auto_now=True) 
    def __unicode__(self): 
     return self.AnswerText 

class Comprehension(models.Model): 
    ComprehensionTitle = models.CharField(max_length=100, verbose_name='Comprehension Title') 
    ComprehensionsText = models.TextField(verbose_name='Text') 
    ComprehensionsRemarks = models.CharField(max_length=400, verbose_name='Remarks for this Comprehension', null=True, blank=True) 
    LastUpdate = models.DateTimeField("Last Updated", auto_now=True) 
    def __unicode__(self): 
     return self.ComprehensionTitle 
    def was_published_recently(self): 
     return self.LastUpdate >= timezone.now() - datetime.timedelta(1) 

    def save(self, *args, **kwargs): 
     #overrides the default save function to split the comprehension paragraph into sentences and adds them as probable answers 
     AnswerList = self.ComprehensionsText.split("u'\u0964'") 

    for sentence in AnswerList: 
     p = Answer.objects.create(AnswerText = sentence, ComprehensionAnswer = self.pk) 

    super(Comprehension, self).save(*args, **kwargs) 

содержимого внутри admin.py

class ComprehensionAdmin(admin.ModelAdmin): 
    form = ComprehensionForm 
    fieldsets = [ 
    ('Main', {'fields': ['ComprehensionTitle','ComprehensionsText']}), 
    ('Additional Info', {'fields': ['ComprehensionsRemarks'], 'classes': ['collapse']}), 
    ] 
    inlines = [QuestionInline, AnswerInline] 
    list_display = ('ComprehensionTitle', 'LastUpdate') 
    list_per_page = 10 


class QuestionInline(admin.TabularInline): 
    model = Question 
    extra = 2 

class AnswerInline(admin.TabularInline): 
    model = Answer 
    extra = 2 

admin.site.register(Question) 
admin.site.register(Answer) 
admin.site.register(Comprehension, ComprehensionAdmin) 

Я также следовал подход, упомянутые на этом page. Но, пустое о том, как создать объекты в состоянии фиксации, используя внешний ключ модели Comprehension.

ответ

3

Вы должны использовать self вместо self.pk и обратите внимание, что self ссылается на текущий объект.

p = Answer.objects.create(AnswerText = sentence, ComprehensionAnswer = self) 

С TRACEBACK, это ясно показывает, что, ComprehensionAnswer атрибут Answer модели ожидает объекта Comprehension модели. Но вы передаете идентификатор этого объекта.

+0

Вау, ты спас мой день @ Авинаш Радж. С утра я перетасовал разные подходы, теперь результаты. Большое спасибо –

+0

Рад, что это сработало :-) –

+0

Будучи php-кодером ранее, я предположил, что я должен предоставить первичный ключ для хранения в внешнем ключе. Хорошо, что django дает такой мощный функциональный способ получить идентификатор от объекта напрямую. Еще раз спасибо. –

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