SurveyQuestionBase
とSurveyResponseBase
という2つの抽象クラスを構築しようとしています。これらのクラスは、Webサイトで特定の調査を実装するための新しいコンクリートモデルを素早く定義するためのテンプレートです。私が抱えている問題は、SurveyResponseBase
モデルが具体的に作られたときにForeignKey
という具象モデルをSurveyQuestionBase
と定義しなければならないということです。 question = models.ForeignKey(SurveyQuestionBase)
をどちらも私は同様の理由None
またはapp_label.ModelName
としてそれを持つことができます。ForeignKeyを持つ抽象モデルを別の抽象モデルに定義する
Djangoは、私は、例えば、これを行うことはできませんので、私たちは抽象クラスにForeignKeys
を定義することができません。
新しいコンクリートモデルを作成してForeignKey
にこれを指すようにしてください:question = models.ForeignKey(concrete_model)
と、このモデルが確実に置き換えられることを確認してください。
同じことを達成するためのクリーンな方法はありますか? 私は誰かがSurveyResponseBase
から、具体的なモデルを定義したとき、彼らはここでSurveyQuestionBase
から定義された具体的なモデルへのForeignKey
は、完全なコードだ含まれていることを確認するだけです:
from __future__ import unicode_literals
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from django.db import models
# Implementation borrows from: https://github.com/jessykate/django-survey/
class SurveyQuestionBase(models.Model):
TEXT = 'text'
INTEGER = 'integer'
RADIO = 'radio'
SELECT = 'select'
MULTI_SELECT = 'multi-select'
ANSWER_TYPE_CHOICES = (
(INTEGER, 'Integer',),
(TEXT, 'Text',),
(RADIO, 'Radio',),
(SELECT, 'Select',),
(MULTI_SELECT, 'Multi-Select',),
)
question = models.TextField()
required = models.BooleanField()
question_type = models.CharField(choices=ANSWER_TYPE_CHOICES, max_length=20)
class Meta:
abstract = True
class SurveyResponseBase(models.Model):
"""
concrete_question_model: 'app_label.Model' - Define the concrete model this question belongs to
"""
concrete_model = 'SurveyQuestionBase'
question = models.ForeignKey(concrete_model)
response = models.TextField()
class Meta:
abstract = True