2010-08-13 23 views
3

以外的数据是否有用于处理存在作为特定Django应用程序的上下文中一个Django模型和作为非Django的类的对象的合理图案该特定应用程序之外?两类:一个用于django的模型和一个用于表现的django

例如,假设我在Django应用程序Blog中有Post模型。我希望能够与Blog Django应用程序之外代表这篇文章的类进行交互,并可能在不同的Django应用程序中进行交互。

在过去,我刚刚创建了两个完全分离的类,它们的接口略有不同。 Django模型包含从非Django版本创建或导出到非Django版本的方法。但这种感觉对我来说都是错误的。

编辑:我意识到,我的语言和使用单词“访问”的是混乱的。我并没有问如何与Django应用程序交谈,我询问了如何使用Django模型类和非Django类代表具有相同接口的相同数据,我可以将Django模型对象导出到非Django类,所以我可以在另一个应用程序中使用它。 Errr,这可能不是很清楚吗?

+0

你还在使用数据库和ORM吗? (我们自己一直使用ORM和批处理作业,不需要重复) – 2010-08-13 19:30:45

+0

在定义模型的django应用程序的上下文中,我们将使用数据库,ORM以及django提供的其他内容它。但是在那个特定的django应用程序之外,我希望能够以不依赖于任何数据库的方式表示该对象。 – guidoism 2010-08-13 20:01:42

+0

“我希望能够以不依赖于任何数据库的方式表示该对象”为什么?这似乎是不必要的复杂性。这有什么用途? – 2010-08-13 20:26:01

回答

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

您可以在正常服务器环境之外使用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这个legwork。

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

如果你真的需要让他们在不同的项目,那么我可能会写在Django看法添加,获取,更新或删除我的模型进行交互的API - 可能使用REST API。你可以得到一些想法做这个here

+0

我绝对不希望模型被用作它来自的django应用程序之外的模型。而且我没有从应用程序中获取数据的问题。我遇到的问题是我正在编写两个看起来非常相似的类,但它们有不同的API。有没有办法让我尽量减少每次我想要的东西时必须编写的代码的数量和复杂性1.用django表示数据库中的表,并且2.与数据库上下文外部的交互。 – guidoism 2010-08-13 19:54:03

0

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

如果他们是独立的,你可能要创建一个RESTful API到你的模型,其中外部应用程序可以再通过HTTP访问。 django-piston项目使这个简单。这是你之后的事情吗?

相关问题