Новичок: Попытка понять, как приложения взаимодействуют в Django

29
задан 8 revs, 4 users 47% 21 April 2012 в 17:51
поделиться

4 ответа

Смотрите на django's, встроенный contenttypes платформа :

django.contrib.contenttypes

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

, Например, если у Вас есть некоторый объект содержания, который Вы хотите "присоединить" к другим объектам содержания различных типов, как разрешение каждому пользователю оставить "любимую" звезду на сообщении в блоге, изображении или профиле пользователя, можно создать Favorite модель с универсальное поле отношения как так:

from django.db import models
from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic

class Favorite(models.Model):
    user = models.ForeignKey(User)
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')

Таким образом можно добавить Favorite звезда от любого пользователя к любой модели в проекте. Если Вы хотите добавить доступ API через класс модели получателя, можно или добавить обратное универсальное поле отношения на модели получателя (хотя это "связало" бы эти две модели, которые Вы сказали, что хотели избежать), или сделайте поиск через Favorite модель с content_type и object_id из экземпляра получателя, посмотрите официальные документы для примера.

22
ответ дан 3 revs 28 November 2019 в 02:00
поделиться

"То, что я записал выше, импортировав модель из другого приложения и установив его как внешний ключ, как приложения Django взаимодействуют?"

Да. Работы для меня.

у Нас есть приблизительно 10 приложений, которые одалживают назад и вперед между собой.

Это приводит к своего рода зависимости в нашем сценарии модульного теста.

Это похоже на это.

  • "владение". У нас есть простое приложение владения данных, которое определяет некоторые базовые понятия владения, от которых зависят другие приложения. Здесь существует несколько простых таблиц.

  • "вещь". [Не настоящее имя]. Нашей вещи приложение владели элементами данных различные группы пользователей. Существует на самом деле несколько сложных таблиц модель для этого приложения. Это зависит от "владения".

  • "таблицы". [Не настоящее имя]. Некоторые наши пользователи создают довольно сложные офлайновые модели (вероятно, с электронными таблицами) и загружают результаты того моделирования в "таблицах". Это имеет кластер довольно сложных таблиц. Это зависит от "владения".

  • "результат". [Не настоящее имя]. Наши результаты основаны на вещах, которые имеют владельцев. Результаты основаны на вещах и таблицах, и являются ответами на потребительские запросы. Это не слишком сложно, возможно, только две или три базовых таблицы. Это зависит от "вещей" и "таблицы". Нет, это не делает абсолютно автономный. Однако это подвергается большему изменению, чем другие вещи, от которых это зависит. Вот почему это является отдельным.

  • "обработка". Мы планируем и контролируем большие пакетные задания. Это находится в этом приложении. Это действительно универсально, и может использоваться во множестве путей. Это полностью стоит один.

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

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

4
ответ дан S.Lott 28 November 2019 в 02:00
поделиться

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

можно достигнуть слабой связи с contenttypes платформой. Это позволяет приложению быть истинно портативным/сменным и все же интегрированное с другими приложениями.

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

Говорят, что Вы хотите, чтобы образцовый "поток" был сменным в любую другую модель. Идея состоит в том, чтобы создать e универсальный внешний ключ (см. django документацию относительно того), и запишите небольшую функцию, которая берет любой объект и возвращает "поток", соответствующий ему (или создает тот при необходимости), и запишите пользовательский тег шаблона, который использует ту функциональность, например, {% get_thread for arbitrary_object as thread %}. Все сообщения связаны с потоком, который связан с объектом, который может иметь любой тип.

можно ли думать об объекте "потока" как своего рода прокси, таким образом, вместо того, чтобы иметь сообщение быть связанным с определенной "статьей" или "сообщением в блоге", он просто связан с потоком, который абстрактен в некотором смысле, что , поток? Это - просто набор сообщений. Поток тогда позволяет себе быть связанным с любым объектом независимо от своего типа. (хотя это делает больше, чем которые, это могло содержать дополнительную информацию ту, которая позволять/запрещать скоро. сообщения, закрываясь/открывая комментарии к странице, и т.д.)

РЕДАКТИРОВАНИЕ

Вот состоит в том, как можно создать универсальный внешний ключ с платформой типов контента:

from django.contrib.contenttypes import generic
from django.contrib.contenttypes.models import ContentType

class Thread( models.Model ):
    object_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    object = generic.GenericForeignKey('object_type', 'object_id')

можно сделать его более "прозрачным" путем использования неявного "общего" интерфейса, что django принимает всю реализацию объектов..

    #inside the Thread class:
    def __unicode__(self):
        return unicode(self.object)
    def get_absolute_url(self):
        return self.object.get_absolute_url()
3
ответ дан hasen 28 November 2019 в 02:00
поделиться

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

, Как Разделить Проект

, я разделил бы приложение если;

  • я планирую разработать его resuable. (и попробуйте слабую связь)
  • (для больших проектов) Она состоит из главного раздела проекта.

, С другой стороны; наличие многих крошечных приложений (таких как приложение с единственной моделью и двумя представлениями) трудно считать и поддержать, по моему скромному мнению.

, Как Приложения Должны Взаимодействовать

, Это зависит от типа проекта и типа приложения снова. Например, если приложение неявно зависит от другого (т.е. не универсально), импортирующие и использующие ссылки из другого приложения приемлемы. В этом случае второе приложение могло бы быть установлено одно, но первому нужно присутствие второго.

, Если Вы хотите сделать приложение очень допускающим повторное использование и универсальным, такое как приложение комментария, Вы, возможно, должны были бы интегрировать некоторый механизм установки. Возможно, некоторые новые настройки или дополнительная конфигурация URL или специальная директива/метод по Вашим моделям... django.contrib.admin хороший пример для этого.

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

2
ответ дан muhuk 28 November 2019 в 02:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: