Неизвестные поля в Django Model - PullRequest
1 голос
/ 06 июля 2010

Я надеюсь построить модель для одной таблицы, в которой будут размещаться различные типы «статей» (ради аргумента).

Каждая статья будет иметь НАИБОЛЕЕ общие поля (например, заголовок, дата и т. Д.), Но есть случаи, когда некоторые типы статей (вне моего контроля) имеют немного разные требования к полям и соответствующие правила проверки.Ни одно поле никогда не будет содержать особенно большое количество данных (~ 100 знаков макс.).

В данный момент я рассматриваю модель, которая определяет все общие поля, а затем имеет текстовое поле для любых необычных полей, которые могутбыть подробно изложенным в XML / JSON:

class Article(models.Model):
    owner = models.ForeignKey('User')
    title = models.CharField(max_length=20)
    published = models.BooleanField()
    extra = model.TextField() # XML/JSON here for any unusual fields
    created = models.DateField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True, auto_now_add=True)
    # ... etc.

Я бы создал классы форм django для обработки проверки при добавлении новых типов статей, но я стараюсь избегать использования разных таблиц для разных типов статей.1009 * Есть ли общепринятый способ справиться с подобной ситуацией или это в значительной степени субъективно?Очевидно, что XML / JSON добавляет немного печальных издержек.

Спасибо.

Ответы [ 3 ]

1 голос
/ 06 июля 2010

Это ... довольно ужасный способ сделать это.Обычно вы помещаете эти данные в отдельную таблицу и относитесь к ней, но ... что угодно.

django-picklefield

0 голосов
/ 06 июля 2010

Я создаю модель, которая наследуется от модели Article.
Если вы хотите создать таблицу для каждой модели, просто отметьте abstract = True в своем метаклассе.
Если вы хотите создать отношение «один к одному» с базой Article, просто убедитесь, что в вашем метаклассе abstract = False.
Используйте юг, чтобы перенести ваши новые модели в базу данных и готово.

См. эту статью и этот документ для получения дополнительной информации о наследовании модели.

Есть ли особая причина, по которой вам нужна такая гибкость полей?
Могут ли они измениться из офиса?

0 голосов
/ 06 июля 2010

Не могли бы вы сделать это с помощью GenericForeignKeys?

http://www.djangoproject.com/documentation/models/generic_relations/

Вы бы добавили:

extra_type = models.ForeignKey(ExtraType)
extra = generic.GenericForeignKey()

к вашей модели. Кажется, лучше, чем в том числе JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...