首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何实现这种类型的模型继承,以及如何将表链接到django中的任何其他表

如何实现这种类型的模型继承,以及如何将表链接到django中的任何其他表
EN

Stack Overflow用户
提问于 2015-01-15 11:34:30
回答 1查看 211关注 0票数 0

我有以下的表格安排:

目前的工作方式:

可以根据链接到的EventType创建事件并进行扩展。

如果EventType有额外的字段(如果has_additional_fields是真的),那么事件将由一个名为"EventType_TheNameOfTheEventType“的表进行扩展,但是,如果EventType没有其他字段,则该事件将不会由其他表扩展。

如果扩展了该事件,则将提供其他输入字段。

由于表的命名方式,事件的"type_data“字段所引用的行的表将被知道。

示例:

类型为“EventType”的事件可能有一个附加字段,如“组”,并将不同于“会议”类型的事件,后者可能有其他字段,如“主题”。

类型为"Normal“的事件将没有其他字段。

问题:

这是实现这种继承的最佳方式吗?

我想知道如何在Django中创建这个模型。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-15 12:16:38

Django有内容类型框架,因此您可以根据自己的意愿命名具体事件:

代码语言:javascript
运行
复制
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

获取所有事件的列表:

代码语言:javascript
运行
复制
Event.objects.all()

获取项目列表:

代码语言:javascript
运行
复制
ProjectEvent.objects.all()

通过id获取具体(“未知”)事件:

代码语言:javascript
运行
复制
Event.objects.get(pk=id).get_concrete_event()

通过id获取事件的真实模型:

代码语言:javascript
运行
复制
Event.objects.get(pk=id).get_real_model()

获取编辑具体事件的表单:

代码语言:javascript
运行
复制
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())

获取相同的表单,然后知道事件类型:

代码语言:javascript
运行
复制
ProjectEventForm = modelform_factory(ProjectEvent)
form = ProjectEventForm(instance=ProjectEvent.objects.get(pk=id))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27962491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档