如何实现这种类型的模型继承以及如何 link a table to any other table in django
How to implement this type of model inheritance and how to link a table to any other table in django
我对 table 的排列如下:
目前的运作方式:
可以根据事件链接到的事件类型创建和扩展事件。
如果 EventType 有额外的字段(如果 has_additional_fields 为 true),那么事件将通过一个名为 "EventType_TheNameOfTheEventType" 的 table 扩展,但是,如果 EventType 没有额外的字段字段,则事件将不会被其他 table.
扩展
如果事件被扩展,额外的输入字段将可用。
事件的 "type_data" 字段引用的行的 table 将因 table 的命名方式而已知。
示例:
"Project" 类型的事件(EventType 名称)可能有一个额外的字段,例如 "Group",并且不同于 "Meeting" 类型的事件,后者可能有额外的字段比如"Topic".
"Normal" 类型的事件将没有附加字段。
问题:
这是实现这种继承的最佳方式吗?
我想知道如何在 Django 中为此创建模型。
Django 有 contenttypes 框架,因此您可以随意命名具体事件:
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获取具体的("unknown")事件:
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))
我对 table 的排列如下:
可以根据事件链接到的事件类型创建和扩展事件。
如果 EventType 有额外的字段(如果 has_additional_fields 为 true),那么事件将通过一个名为 "EventType_TheNameOfTheEventType" 的 table 扩展,但是,如果 EventType 没有额外的字段字段,则事件将不会被其他 table.
扩展如果事件被扩展,额外的输入字段将可用。
事件的 "type_data" 字段引用的行的 table 将因 table 的命名方式而已知。
示例:
"Project" 类型的事件(EventType 名称)可能有一个额外的字段,例如 "Group",并且不同于 "Meeting" 类型的事件,后者可能有额外的字段比如"Topic".
"Normal" 类型的事件将没有附加字段。
问题:
这是实现这种继承的最佳方式吗?
我想知道如何在 Django 中为此创建模型。
Django 有 contenttypes 框架,因此您可以随意命名具体事件:
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获取具体的("unknown")事件:
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))