两个类:一个用于django模型,另一个用于表示django之外的数据

时间:2010-08-13 19:05:37

标签: python django django-models

是否有合理的模式来处理在特定Django应用程序的上下文中作为Django模型存在的对象以及作为该特定应用程序之外的非Django类?

例如,假设我在Django应用程序博客中有一个Post模型。我希望能够在Blog Django应用程序之外与代表此帖子的类进行交互,并且可能在不同的Django应用程序中进行交互。

过去我刚创建了两个完全独立的类,接口略有不同。 Django模型包含从非Django版本创建或导出到非Django版本的方法。但这对我来说完全没错。

编辑:我意识到我的语言和“访问”这个词的使用令人困惑。我不是在询问如何与Django应用程序通信,我问的是如何使用Django模型类和非Django类表示相同的数据具有相同的接口,我可以将Django模型对象导出到非Django类,所以我可以在另一个应用程序中使用它。呃,这可能也不清楚了吗?

3 个答案:

答案 0 :(得分:2)

您可以在普通服务器环境之外使用Django代码(如测试用例所示)。如果您需要编写与Django模型一起使用的Python脚本,您可以像往常一样使用ORM访问/修改模型,只需要先使用一个简短的魔术咒语:

from django.core.management import setup_environ
from mysite import settings
from myapp.models import MyModel

setup_environ(settings)

# Now do whatever you want with the ORM
mystuff = MyModel.objects.all()

我倾向于使用management commands来避免这项工作。

如果你需要让多个Django应用程序访问这些数据,那很好 - 只需确保它们在同一个Django项目中。

如果你真的需要将它们放在单独的项目中,那么我可能会编写一个与Django视图交互的API来添加,获取,更新或删除我的模型 - 可能使用REST API。你可以得到一些想法here

答案 1 :(得分:2)

如果我理解正确,那么您希望在多个程序中将某些表示为对象。更有意思的是,如果你的对象是在Django程序的上下文中使用的,那么你希望你的对象是一个Django模型,这样你就可以将你的对象保存在数据库中,并完成所有其他的整洁Django可以用模型做的事情。据推测,虽然您没有明确说明它,但是不是仅仅枚举对象的属性,而是您希望无论环境如何(Django或其他方式)都能实现对象的行为。

如果您使用Java或C#实现此功能,我建议使用以下内容:

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

对于IFoo中可用的每种方法,app1.Fooapp2.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 :(得分:0)

我无法通过“访问Django应用程序之外的对象”来想象你的意思。外部应用程序将如何获取定义模型实例的数据?这两个应用程序是如何相关的 - 它们只是相同代码的不同区域,还是它们完全是通过HTTP等方式进行通信的独立进程?

如果它们是分开的,您可能需要为模型创建RESTful API,然后外部应用程序可以通过HTTP访问。 django-piston项目使这很简单。那是你想要的那种东西吗?