Два класса: один для модели django и один для представления данных вне django - PullRequest
3 голосов
/ 13 августа 2010

Существует ли разумный шаблон для обработки объекта, который существует как модель Django в контексте конкретного приложения Django и как класс, отличный от Django, вне этого конкретного приложения?

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

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

РЕДАКТИРОВАТЬ: я понимаю, что мой язык и использование слова «доступ» сбивает с толку. Я не спрашиваю о том, как разговаривать с приложением Django, я спрашиваю о том, как класс модели Django и класс, не являющийся Django, представляют одни и те же данные с тем же интерфейсом, где я могу экспортировать объект модели Django в класс не Django, поэтому я могу использовать его в другом приложении. Э-э-э, это, вероятно, тоже не ясно, не так ли?

Ответы [ 3 ]

2 голосов
/ 14 августа 2010

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

Если бы вы реализовывали это на Java или C #, я бы предложил что-то вроде этого:

interface IFoo { ... }
class FooHelper { ... }
class app1.Foo extends Model implements IFoo { ... }
class app2.Foo implements IFoo { ... }

Для каждого метода, доступного в IFoo, оба app1.Foo и app2.Foo должны будут реализовать метод путем делегирования подходящему методу в FooHelper. Например, метод bar будет выглядеть следующим образом:

interface IFoo { 
    int bar(); 
}

class FooHelper { 
    int bar( object foo ) { ... } 
}

package app1;
class Foo extends Model implements IFoo {
    ...
    int bar() {
        return FooHelper.bar( this );
    }
}

package app2;
class Foo implements IFoo {
    ...
    int bar() {
        return FooHelper.bar( this );
    }
}

Конечно, FooHelper должен быть достаточно умен, чтобы делать правильные вещи, в зависимости от того, какой тип Foo ему передается.

Решение этого в Python должно быть проще, поскольку Python является динамическим языком.

# Create a class decorator
def decorate_foo( fooclass ):

    def bar( self ):
        return 0

    fooclass.bar = bar

# Create a class to decorate
class Foo: pass

# Decorate the class
decorate_foo( Foo )

# Use the decorated class
f = Foo()
f.bar()

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

2 голосов
/ 13 августа 2010

Вы можете использовать код Django вне обычной серверной среды (как это делают тестовые случаи).Если вам нужно написать скрипты Python, которые работают с вашими моделями Django, вы можете просто получить доступ к / изменить ваши модели, как обычно, используя ORM, есть всего лишь короткое волшебное заклинание, которое вы должны использовать сначала:Я стараюсь избегать этого, используя команды управления .

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

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

0 голосов
/ 14 августа 2010

Мне сложно представить, что вы имеете в виду, когда обращаетесь к объекту вне приложения Django. Как внешнее приложение получит данные, которые определяют экземпляр модели? Как связаны два приложения - это просто разные области одного и того же кода, или они представляют собой совершенно разные процессы, взаимодействующие через что-то вроде HTTP?

Если они разделены, вы можете создать RESTful API для ваших моделей, к которому внешнее приложение сможет затем обращаться через HTTP. Проект django-pneon делает это простым. Это то, что вы ищете?

...