< class> < class>への外部キーがありません。 Djangoでモデルをインライン化しようとしたとき

StackOverflow https://stackoverflow.com/questions/609556

  •  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を要求します。それがエラーです。

正解:管理アプリから引き出そうとする:)インラインモデルには、親モデルへの外部キーが必要です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top