Подтвердить что ты не робот

Создание многоразовых Django-приложений?

Я как-то новичок в Django и стараюсь как можно больше отделить мои приложения и построить его как можно более мелкие повторно используемые элементы. Попытка следовать стратегии Джеймса Беннетта по созданию повторно используемых приложений. Имея это в виду, я столкнулся с этой проблемой.

Скажем, у меня было приложение, в котором хранится информация о фильмах:

Код выглядит примерно так:

class Movie(models.Model):
    name = models.CharField(max_length=255)
    ...

Теперь, если бы я хотел добавить оценки, я мог бы использовать django-rating и просто добавить поле к моей модели:

class Movie(models.Model):
    name = models.CharField(max_length=255)
    rating = RatingField(range=5)
    ...

Это по сути означает, что мое приложение для видео теперь зависит от django-рейтингов, и если я захочу его повторно использовать, но вам больше не нужны рейтинги, мне все равно придется устанавливать django-рейтинги или изменять и форкировать приложение.

Теперь я мог обойти это, используя try/except с импортом и определив поле в случае успеха, но теперь мое приложение для видео явно привязано к рейтингу в определении таблицы базы данных.

Кажется гораздо более разумным разделить две модели и определить отношения в модели рейтингов вместо фильма. Таким образом, зависимость определяется, когда я использую рейтинг, но не нужен при использовании приложения Movie.

Как вы справляетесь с этой проблемой? Есть ли лучший подход для разделения моделей?

Я также задаюсь вопросом, есть ли какие-либо значительные штрафы за производительность при этом.

edit: Я хочу пояснить, что это скорее пример проблемы и несколько надуманный, чтобы проиллюстрировать точку. Я хочу иметь возможность добавлять дополнительную информацию без изменения модели "Кино" каждый раз, когда мне нужно добавлять связанные данные. Я ценю ответы до сих пор.

4b9b3361

Ответ 1

В этом случае, лично, я бы сохранил это просто и оставил rating в модели. Вы должны сбалансировать повторное использование с простотой реализации. Это здорово сделать вещи многоразовыми, но ваша модель Movie действительно достаточно полезна, чтобы гарантировать дополнительную работу? И плохо ли иметь зависимость? Я думаю, что многие из этих проектных решений являются субъективными. В этом году в PyCon была хорошая беседа по этой теме: http://blip.tv/file/4882961

Ответ 2

Во-первых, я согласен с zeekay выше, вы должны задуматься, стоит ли это количество повторного использования для вашей модели.

Если это действительно так, вы можете создать новое приложение movierating с RatingModel, которое имеет FK в movies.models.Movie и поле rating.

Вы никогда не передадите rating каким-либо образом шаблонам. Для этого вы можете создать class-based-views, а в movierating.views вы можете расширить и переопределить метод get_context.

Не забывайте, что достижение повторного использования - это основополагающее оценочное суждение, которое разработчик должен делать и переизбыть, может быть так же плохо, как не делать это в первую очередь.

Ответ 3

Наличие зависимостей не обязательно является плохим. Для чего-то вроде поля (рейтинг, timedelta, объект JSON), где нет встроенного поля, которое делает то, что вам нужно, нужно включить отдельное приложение, которое обрабатывает это (и, возможно, некоторые связанные функции, такие как теги шаблонов), является функцией, не ошибка.

Больше проблем возникает, когда модели ваших моделей моделей ссылаются на другие приложения. Конечно, это происходит в реальном мире, но в этом случае значительно сложнее идентифицировать изолированные модели.