我有以下的表格安排:

目前的工作方式:
可以根据链接到的EventType创建事件并进行扩展。
如果EventType有额外的字段(如果has_additional_fields是真的),那么事件将由一个名为"EventType_TheNameOfTheEventType“的表进行扩展,但是,如果EventType没有其他字段,则该事件将不会由其他表扩展。
如果扩展了该事件,则将提供其他输入字段。
由于表的命名方式,事件的"type_data“字段所引用的行的表将被知道。
示例:
类型为“EventType”的事件可能有一个附加字段,如“组”,并将不同于“会议”类型的事件,后者可能有其他字段,如“主题”。
类型为"Normal“的事件将没有其他字段。
问题:
这是实现这种继承的最佳方式吗?
我想知道如何在Django中创建这个模型。
发布于 2015-01-15 12:16:38
Django有内容类型框架,因此您可以根据自己的意愿命名具体事件:
class EventType(models.Model):
name = models.CharField(max_length=200)
has_additional_fields = models.BooleanField(default=True)
content_type = models.ForeignKey(ContentType)
class Event(models.Model):
data = models.TextField(null=True)
event_type = models.ForeignKey(EventType)
def get_real_model(self):
return self.event_type.content_type.model_class()
def get_concrete_event(self):
return self.event_type.content_type.get_object_for_this_type(pk=self.pk)
class ProjectEvent(Event):
group = models.CharField(max_length=200)
class MeetingEvent(Event):
topic = models.CharField(max_length=200)
class NormalEvent(Event):
pass获取所有事件的列表:
Event.objects.all()获取项目列表:
ProjectEvent.objects.all()通过id获取具体(“未知”)事件:
Event.objects.get(pk=id).get_concrete_event()通过id获取事件的真实模型:
Event.objects.get(pk=id).get_real_model()获取编辑具体事件的表单:
from django.forms.models import modelform_factory
event = Event.objects.get(pk=id)
EventForm = modelform_factory(event.get_real_model())
form = EventForm(instance=event.get_concrete_event())获取相同的表单,然后知道事件类型:
ProjectEventForm = modelform_factory(ProjectEvent)
form = ProjectEventForm(instance=ProjectEvent.objects.get(pk=id))https://stackoverflow.com/questions/27962491
复制相似问题