2015-01-15 2 views
0

У меня есть следующее расположение столов:Как реализовать этот тип модели наследования и как связать таблицу с любой другой таблицей в Джанго

Arrangement of tables Как это работает на данный момент:

Событие может быть создано и может быть расширено, на основе связанного с ним типа EventType.

Если EventType имеет дополнительные поля (если has_additional_fields is true), то событие будет расширен таблицей «EventType_TheNameOfTheEventType», однако, если в EventType нет дополнительных полей, тогда событие не будет распространено другим Таблица.

Если событие расширено, будут доступны дополнительные поля ввода.

Таблица строк, в которой поле «type_data» события ссылается, будет известно из-за того, как будут называться эти таблицы.

Пример:

Событие типа (название EventType) «Проект» может иметь дополнительное поле, таких как «Группа» и будет отличаться от события типа «собрания», который может иметь дополнительное таких как «Тема».

Событие типа «Обычный» не будет иметь дополнительных полей.

Вопрос:

Это лучший способ реализации такого рода наследования?

Я хотел бы получить представление о том, как создать модели для этого в Django.

ответ

1

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:

Event.objects.get(pk=id).get_concrete_event() 

Получить реальную модель события по идентификатору:

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)) 
+0

Я чем-то смущен. Поле content_type в классе EventType ссылается на тип содержимого одного из типов событий? Например, ссылается ли он на тип контента ProjectEvent, если имя EventType является «проектом»? –

+0

Да, вы поняли это правильно. Поле 'content_type' указывает на' Event' или один из потомков 'Event' (' ProjectEvent', 'MeetingEvent' и т. д.), – catavaran

+0

Хорошо, да, это логично. Но когда я создаю EventType, как мне связать его с типом контента? –

Смежные вопросы