代码之家  ›  专栏  ›  技术社区  ›  guidoism

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

  •  3
  • guidoism  · 技术社区  · 14 年前

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

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

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

    3 回复  |  直到 14 年前
        1
  •  2
  •   Craig Trader    14 年前

    如果我没听错的话,你有

    如果用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 );
        }
    }
    

    当然,fooheloper必须足够聪明,根据传递的Foo类型来做正确的事情。

    # 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()
    

    只需将所有功能放入decoration\u foo函数中,然后让它在需要调用其中一个添加的方法之前将该功能添加到类中。

        2
  •  2
  •   Community CDub    7 年前

    您可以在正常服务器环境之外使用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视图交互的API来添加、获取、更新或删除我的模型—可能会使用REST API。你可以想出一些办法 here .

        3
  •  0
  •   Daniel Roseman    14 年前

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

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