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

sys*_*asa 6 database mapping django 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,因为它意味着前端,而我试图覆盖后端管理员.

Tom*_*ski 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"}
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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


sys*_*asa 0

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

我有两个自定义模板:

   my_model_list.html
   my_model_detail.html
Run Code Online (Sandbox Code Playgroud)

在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)
Run Code Online (Sandbox Code Playgroud)

在主 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 ) )
)
Run Code Online (Sandbox Code Playgroud)

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