【问题标题】:how to create a Django models that doesn't map to a database table如何创建不映射到数据库表的 Django 模型
【发布时间】:2011-05-07 21:09:11
【问题描述】:

我想创建一个不映射到数据库表的模型。相反,作为 python 对象保留在内存中。

实际上,该模型应该表示来自许多其他表映射模型的规范化数据。

其他模型存储可以在一天内多次编辑的数据。由于这些多次编辑,我不想要一个执行规范化/计算并将它们存储在数据库中的表映射模型,因为这些存储的数据可能会立即过时。

每次访问这个规范化模型时(通过管理员),我希望它从头开始对来自其他模型的数据执行规范化(以便它可以显示最新数据)并且表现得像一个普通模型会在管理员下显示列表视图和每一行的详细视图。

在神道教的回答后编辑:

@Shintoist 感谢您清理并提供可用的方法。我刚刚实现了它,但最后撞到了一堵小墙:)

@skirmantas:是的,计算在一个单独的对象中。该对象正在传递到自定义视图中。

问题:一个问题是,在 admin.py 下,我为这个对象创建了一个 modeladminclass(它不继承 models.Model),因此我的自定义视图可以覆盖更改列表视图和更改视图。 然后我使用 admin.site.register() 来注册这个类模型类和模型管理员。但是,由于这个模型根本不是 django 模型(因为它是内存中的独立 python 对象) admin.site.register() 抛出“'type' object is not iterable”错误。我不想使用 url.py 而不是 admin.py,因为它是用于前端的,而我试图覆盖后端管理员。

【问题讨论】:

  • 我了解您想要使用管理员,但根据您的需要,这是一种非常全面的方式。难道你不能用页面某处的链接覆盖管理模板,该链接指向使用你编写的视图的 url?这样它就会“进入”管理员。 Django 会自动寻找覆盖内置插件的模板。否则,我建议您使用 Tomasz Zielinski 的解决方案。
  • @tomas。如果我创建规范化模型以映射到内存中的表,它是否仍然是静态的。我的意思是,模型在打开时会从其他模型中获取最新数据,规范化/处理该数据并显示一个列表。与此同时,如果有人编辑了其他模型,在服务器重新启动(这将重新加载内存表)之前,这些模型不会显示在规范化模型中。
  • 我还想补充一点,我的 django 实现已经使用了三个数据库,一个包含遗留数据(以便我可以将其迁移到新系统),一个用于通过夹具运行测试的 SQLlite,第三个,主数据库。这也意味着,我将仅为一个模型添加第四个数据库。
  • 为什么你甚至想用 admin.site.register 注册一些不是 django 模型的类?制作你的视图和你自己的表单来做你需要的东西。

标签: database django mapping models


【解决方案1】:

如何使用多个数据库,并将其中一个配置为使用内存表?

对于 MySQL,它看起来像这样:

DATABASES = {
    'default': {
    },
    'memory': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'dbname',
        'USER': 'dbuser',
        'PASSWORD': '',  
        'HOST': 'localhost',
        'PORT': '',         

        'OPTIONS': {"init_command": "SET storage_engine=MEMORY"}
    }
}

请注意,您只需要在创建表时使用SET storage_engine,但它可能不会为您的用例增加太多开销。

http://dev.mysql.com/doc/refman/5.0/en/memory-storage-engine.html

【讨论】:

  • 你打败了我。虽然我会在 SQLite 中完成。
  • @JudoWill:对,SQLite 也是一种方法。就我个人而言,我更喜欢在所有工作中使用相同的 DBMS,只是为了在某些不兼容的情况下保持安全。然而,这主要涉及单元测试。
  • 如果我创建规范化模型以映射到内存中的表,它是否仍然是静态的。我的意思是,模型在打开时会从其他模型中获取最新数据,规范化/处理该数据并显示一个列表。与此同时,如果有人编辑了其他模型,在服务器重新启动之前,这些模型不会显示在规范化模型中(这将重新加载内存表)
【解决方案2】:

为什么要有模型?在视图中引用您的计算,为其编写模板并要求管理员登录才能访问它。这只会在您加载页面时重新创建此规范化数据,并且只会存在于内存中,从而节省资源。

【讨论】:

  • Put your calculations in a view 这是你能做的最糟糕的事情。这将导致不可读和不可维护的代码。视图应保持简约。任何计算都应该在其他地方进行。 Forms 可以很好地解析请求数据。计算可以在助手内完成。
【解决方案3】:

根据这些“计算”的复杂程度,听起来您想要一个自定义的database view(我相信至少受到 SQLite、MySQL、Postgres 和 Oracle 的支持)与带有 @ 的模型一起使用987654322@.

如果幸运的话,您可以让 South 在迁移中为您创建它,但看起来 South 还不支持视图。

【讨论】:

    【解决方案4】:

    嗯。谢谢大家的帮助。我想出的解决方案(当然是在你的帮助下)如下:

    我有两个自定义模板:

       my_model_list.html
       my_model_detail.html
    

    在views.py下:

    class MyModel(object):
        # ... Access other models
        # ... process / normalise data 
        # ... store data
    
    @staff_member_required
    def my_model_list_view(request) #show list of all objects
        #. . . create objects of MyModel . . .
        #. . . call their processing methods . . .
        #. . . store in context variable . . . 
        r = render_to_response('admin/myapp/my_model_list.html', context, RequestContext(request))
        return HttpResponse(r)
    
    @staff_member_required
    def my_model_detail_view(request, row_id) # Shows one row (all values in the object) in detail     
        #. . . create object of MyModel . . .
        #. . . call it's methods . . .
        #. . . store in context variable . . . 
        r = render_to_response('admin/myapp/my_model_detail.html', context, RequestContext(request))
        return HttpResponse(r)
    

    django主urls.py下:

    urlpatterns = patterns( 
        '',
        (r'^admin/myapp/mymodel/$', my_model_list_view),
        (r'^admin/myapp/mymodel/(\d+)/$', my_model_detail_view),
        ( r'^admin/', include( admin.site.urls ) )
    )
    

    正如您已经注意到的,我必须将 url 模式插入到我的 url.py 文件中。我不知道这是否是最好的方法,因为我认为 url.py 文件不适用于管理相关页面。它仅适用于网站前端。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 2012-11-15
      • 2020-09-11
      相关资源
      最近更新 更多