< class> < class>への外部キーがありません。 Djangoでモデルをインライン化しようとしたとき
-
03-07-2019 - |
質問
20種類の奇妙な多肢選択問題を含むクイズ型アプリケーションを作成できる必要があります。
3つのモデルがあります:クイズ
、 Questions
、および Answers
。
管理インターフェイスでクイズを作成し、クイズ要素と回答要素をインライン化します。
目標は、「クイズを追加」をクリックし、20の質問フィールドがあり、それぞれに4つの回答フィールドがあるページに移動することです。
現在私が持っているもの:
class Quiz(models.Model):
label = models.CharField(blank=true, max_length=50)
class Question(models.Model):
label = models.CharField(blank=true, max_length=50)
quiz = models.ForeignKey(Quiz)
class Answer(models.Model):
label = models.CharField(blank=true, max_length=50)
question = models.ForeignKey(Question)
class QuestionInline(admin.TabularInline):
model = Question
extra = 20
class QuestionAdmin(admin.ModelAdmin):
inlines = [QuestionInline]
class AnswerInline(admin.TabularInline):
model = Answer
extra = 4
class AnswerAdmin(admin.ModelAdmin):
inlines = [AnswerInline]
class QuizAdmin(admin.ModelAdmin):
inlines = [QuestionInline, AnswerInline]
admin.site.register(Question, QuestionAdmin)
admin.site.register(Answer, AnswerAdmin)
admin.site.register(Quiz, QuizAdmin)
クイズを追加しようとすると、次のエラーが表示されます:
class 'quizzer.quiz.models.Answer'> has no ForeignKey to <class 'quizzer.quiz.models.Quiz'>
これは実行可能ですか、それともDjango Adminアプリから引き出そうとしているのですか?
解決
&quot; nested&quot;はできません。 Django管理者のインライン(つまり、インライン質問を含むクイズを作成することはできません。各インライン質問にはインライン回答があります)。そのため、照準を下げてインライン質問を作成する必要があります(1つの質問を表示するためにナビゲートすると、インライン回答が表示される可能性があります)。
したがって、モデルは問題ありませんが、管理コードは次のようになります。
class QuestionInline(admin.TabularInline):
model = Question
extra = 20
class AnswerInline(admin.TabularInline):
model = Answer
extra = 4
class QuestionAdmin(admin.ModelAdmin):
inlines = [AnswerInline]
class AnswerAdmin(admin.ModelAdmin):
pass
class QuizAdmin(admin.ModelAdmin):
inlines = [QuestionInline]
AnswerAdminがAnswerInlineを持つこと、またはQuestionAdminがQuestionInlineを持つことは意味がありません(これらが自己参照外部キーを持つモデルでない限り)。 AnswerにはQuizへの外部キーがないため、QuizAdminにはAnswerInlineを設定できません。
Djangoがネストされたインラインをサポートしていた場合、QuestionInlineが「インライン」を受け入れる論理的な構文になります。 [AnswerInline]に設定した属性。しかし、そうではありません。
また、「追加= 20」に注意してください。クイズを読み込むたびに、すべてのクイズの下部に20の空白の質問フォームがあることを意味します(既に20の実際の質問がある場合でも)。たぶんそれはあなたが望むものです-長いページになりますが、一度に多くの質問を簡単に追加できます。
他のヒント
手順を追って説明します。
エラー:&quot; Answer has no FK to Quiz&quot;。
その通りです。 Answerモデルには、クイズに対するFKがありません。質問に対するFKはありますが、クイズはありません。
クイズにAnswerにFKが必要なのはなぜですか?
QuizAdminにはAnswerInlineとQuestionInlineがあります。管理者がインラインを使用するには、インラインモデル(回答と質問)に親管理者に対するFKが必要です。
確認しましょう。質問にはクイズへのFKがあります。
そして。回答にはクイズに対するFKがありません。そのため、クイズ管理者はモデルにないFKを要求します。それがエラーです。
正解:管理アプリから引き出そうとする:)インラインモデルには、親モデルへの外部キーが必要です。