如何创建不映射到数据库表的Django模型

时间:2010-11-10 13:06:22

标签: database django mapping models

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

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

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

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

在Shintoist的回答后编辑:

@Shintoist感谢清理事务并提供可用的方法。我刚刚实现了它,但最后还是打了一堵小墙:)

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

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

4 个答案:

答案 0 :(得分:6)

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

对于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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

根据这些“计算”的复杂程度,听起来你想要一个与模型结合使用的自定义database view(支持,我相信,至少由SQLite,MySQL,Postgres和Oracle支持)与Meta.managed=False

如果你很幸运,你可以让South在迁移中为你创建它,但它看起来不像South支持的观点。

答案 3 :(得分:0)

嗯。谢谢大家的帮助。我提出的解决方案(在您的帮助下)如下:

我有两个自定义模板:

   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文件不适用于管理相关的页面。它只适用于网站前端。