2

私は django をまったく初めて使用し、以前は php コーダーでした。私のアプリには、理解、質問、回答の 3 つのモデルが定義されています。各理解には、理解モデルで「インライン」として定義された複数の質問と回答があります。質問は管理者が直接入力しますが、回答は理解度から自動的に追加されます。私が達成したいのは、理解を文に分割し、各文を現在の理解の外部キーを持つ回答オブジェクトとして追加することです。Comprehension モデルで save メソッドをオーバーライドしようとしています。しかし、保存をクリックすると、インスタンスエラーが発生します

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)

また、このページに記載されているアプローチに従いました。ただし、内包モデルの外部キーを使用してコミット状態でオブジェクトを作成する方法については空白です。

4

1 に答える 1

3

現在のオブジェクトを参照するself代わりにself.pkandを使用する必要があります。self

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

トレースバックから、モデルのComprehensionAnswer属性がモデルのオブジェクトをAnswer期待していることを明確に示しています。Comprehensionしかし、あなたはそのオブジェクトのIDを渡しています。

于 2016-03-06T07:02:04.650 に答える