<فئة> لا يوجد لديه المفتاح الخارجي إلى <فئة> في جانغو عند محاولة مضمنة نماذج

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

  •  03-07-2019
  •  | 
  •  

سؤال

وأنا بحاجة إلى أن تكون قادرة على إنشاء تطبيق نوع المسابقة برصيد 20 بعض غريبة أسئلة الاختيار من متعدد.

ولدي 3 نماذج: Quizzes، 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'>

هل هذا قابل للتحقيق، أو أحاول أن سحب الكثير من التطبيق جانغو المسؤول؟

هل كانت مفيدة؟

المحلول

وأنت لا تستطيع أن تفعل "متداخلة" inlines في المشرف جانغو (أي يمكنك ' ر لها مسابقة مع مضمنة الأسئلة، مع كل سؤال مضمنة وجود أجوبة مضمنة). لذلك ستحتاج إلى خفض مشاهد لمجرد وجود مضمنة (الأسئلة ثم إذا انتقلت إلى عرض سؤال واحد، فإنه يمكن أن يكون أجوبة مضمنة).

وحتى النماذج الخاصة بك على ما يرام، ولكن كود المشرف ينبغي أن تبدو هذه:

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 (إلا إذا كانت هذه النماذج مع مفتاح خارجي ذاتية المرجع). وQuizAdmin لا يمكن أن يكون AnswerInline، لأن الإجابة لا يوجد لديه مفتاح خارجي للمسابقة.

إذا لم جانغو الدعم inlines المتداخلة، بناء الجملة المنطقي أن يكون لQuestionInline لقبول "inlines" السمة التي كنت المقرر أن [AnswerInline]. ولكن لم يحدث ذلك.

لاحظ أيضا أن "إضافية = 20" يعني سيكون لديك 20 أشكال سؤال الفارغة في الجزء السفلي من كل مسابقة، في كل مرة تحميل عنه (حتى لو كان لديها بالفعل 20 أسئلة الفعلية). ربما هذا هو ما تريد - يجعل لصفحة طويلة، ولكن يجعل من السهل على إضافة الكثير من الأسئلة في وقت واحد

نصائح أخرى

ودعونا من خلال متابعة خطوة بخطوة.

والخطأ: "لا يوجد لديه الإجابة FK لمسابقة"

وهذا هو الصحيح. نموذج الإجابة لا يوجد لديه FK إلى مسابقة. أنه يحتوي على FK على السؤال، ولكن ليس الاصعب.

لماذا الجواب بحاجة إلى FK لمسابقة؟

ووQuizAdmin له AnswerInline وQuestionInline. للحصول على المشرف أن يكون inlines، فهذا يعني أن النماذج inlined (الجواب والسؤال) يجب أن يكون لFK إلى المشرف الأم.

ودعونا تحقق. سؤال له FK إلى مسابقة.

و. الجواب لا يوجد لديه FK إلى مسابقة. لذا المشرف مسابقة الخاص بك يتطلب على FK التي تفتقر إلى النموذج الخاص بك. هذا الخطأ.

والصحيح: في محاولة لسحب كثيرا من تطبيق المشرف :) نماذج المضمنة تحتاج مفتاح خارجي للنموذج الأم

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top