如何实现这种类型的模型继承以及如何 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))