2012-04-03 2 views
4

У меня есть проект Django, который становится все более сложным. Я начал с традиционных файлов: моделей, представлений и forms.py. Проблема, которую я сейчас имею в виду, заключается в том, что эти файлы становятся все больше и больше, и я хотел бы разбить их на управляемые части. Каковы наилучшие методы?Как структурировать сложный проект Django?

Кроме того, мне интересно, если лучше использовать метод класса для модели в Django? Например, у меня есть класс Vote, на котором я хотел бы добавить методы для получения количества голосов для определенного пользователя, контента и т. Д.?

+3

Официальный совет Джанго, похоже, «используется менеджерами», но читает сообщения в блоге об этом; Я нахожу методы классов более удобными – agf

+0

@agf Я согласен - мне еще предстоит найти, что это стоит проблемы менеджера, особенно учитывая, что можно классифицировать методы класса в базовые классы. – Marcin

+0

Где я могу найти пример? Как насчет количества просмотров и форм, которые все входят в их собственный файл? – Martin

ответ

2

Я нахожу, что рефакторинг действительно может помочь. Есть много похожих взглядов, которые просто имеют разные шаблоны или запросы? Сделайте более общий вид, который принимает несколько имен шаблонов, записей и т. Д.

Все, что требует больших вычислений, переносится в файл utils.py в том же каталоге.

Методы класса предназначены для действий, которые влияют на одну запись; менеджеры занимаются фильтрацией записей или созданием записи.

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

+1

Я согласен с Иорданией. Когда модели, представления и т. Д. Становятся слишком большими, это может свидетельствовать о том, что вы можете реорганизовать их в отдельные приложения. – tamakisquare

1

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

Возможно, лучший способ управлять разбитыми видами и т. Д. - заменить каждый файл, который вы хотите разбить на свой собственный пакет, и поместить все, что вам нужно (если угодно) в модуль __init__.py этого пакета.

1

Об использовании менеджеров моделей и методов класса. делая это таким образом, ваш код легче читать другим, и вы можете комбинировать этот вид кода с другим фильтром/select_related/order_by. Ниже приведен простой пример, но по мере усложнения логики менеджеры делают отличное дополнение к вашей настройке и очень мало кода, дают вам много хорошей соединительной ткани в вашем приложении.

Я согласен с Иорданией в том, что вам может потребоваться более одного приложения, и если у вас теперь есть большая база кода, линии, чтобы разбить все, должно быть более очевидным.

class VoteManager(models.ModelManager): 
    def by_user(self, user): 
     return self.filter(user=user) 
    def by_content(self, content) 
     return self.filter(content=content) 

class Vote(models.Model) 
    user = models.ForeignKey(User) 
    content = models.ForeignKey(Content) 
    ... 
    objects = VoteManager()