как создать модели Django, которые не отображаются в таблицу базы данных - PullRequest
6 голосов
/ 10 ноября 2010

Я хочу создать модель, которая не сопоставляется с таблицей базы данных. Вместо этого остается в памяти как объект Python.

На самом деле, эта модель должна представлять нормализованные данные из многих других картографических моделей.

Другие модели хранят данные, которые можно редактировать несколько раз в течение одного дня. Из-за этих многочисленных изменений я не хочу, чтобы модель с табличными картами выполняла нормализации / вычисления и сохраняла их в базе данных, так как эти сохраненные данные могут сразу устареть.

Каждый раз, когда к этой нормализованной модели обращаются (через администратора), я хочу, чтобы она с нуля выполняла нормализацию данных из других моделей (чтобы она могла показывать самые последние данные) и вела себя так же, как нормальная модель под администратором, как Отображение списка и подробное представление для каждой строки.

Редактировать после ответа Синтоиста:

@ Shintoist Спасибо за то, что вычистили и применили подход. Я только что реализовал это, но в конце концов попал в маленькую стенку :)

@ skirmantas: Да, расчеты в отдельном объекте. Этот объект передается в пользовательские представления.

Проблема: Одна проблема состоит в том, что в admin.py я создал modeladminclass для этого объекта (который не наследует models.Model), поэтому мои пользовательские представления могут переопределять представление списка изменений и представление изменений. Затем я использую admin.site.register (), чтобы зарегистрировать этот классоподобный класс и modeladmin. Но, поскольку эта модель вообще не является моделью django (так как это независимый объект python в памяти), admin.site.register () выдает ошибку «тип объекта не повторяется». Я не хочу использовать url.py вместо admin.py, так как он предназначен для внешнего интерфейса, пока я пытаюсь переопределить backend-admin.

Ответы [ 4 ]

6 голосов
/ 10 ноября 2010

Как насчет использования нескольких баз данных и настройки одной из них для использования таблиц в памяти?

Для 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

2 голосов
/ 10 ноября 2010

Зачем вообще модель?Сделайте ссылку на ваши расчеты в представлении, напишите шаблон для него и потребуйте доступ администратора к нему.Это восстановит эти нормализованные данные только при загрузке страницы и будет существовать только в памяти, экономя ваши ресурсы.

1 голос
/ 11 ноября 2010

В зависимости от того, насколько сложны эти «расчеты», звучит так, как будто вы хотите, чтобы пользовательское представление базы данных (поддерживалось, я думаю, SQLite, MySQL, Postgres и Oracle, по крайней мере) использовалось совместнос моделью с Meta.managed=False.

Если вам повезет, вы сможете получить Юг, чтобы создать его для вас в процессе миграции, но это не похоже наЮг пока поддерживает виды.

0 голосов
/ 11 ноября 2010

Ммм. Спасибо за вашу помощь всем. Решение, которое я нашел (с вашей помощью), выглядит следующим образом:

У меня есть два пользовательских шаблона:

   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 не предназначен для страниц, связанных с администратором. Это только для сайта.

...