2010-11-10 65 views
6

Tôi muốn tạo mô hình không ánh xạ tới bảng cơ sở dữ liệu. Thay vào đó, hãy ở trong bộ nhớ như một đối tượng python.cách tạo mô hình Django không ánh xạ tới bảng cơ sở dữ liệu

Thực ra, mô hình này được cho là đại diện cho dữ liệu được chuẩn hóa từ nhiều mô hình bảng được ánh xạ khác.

Các mô hình khác lưu trữ dữ liệu có thể được chỉnh sửa nhiều lần trong một ngày. Bởi vì nhiều chỉnh sửa này, tôi không muốn một mô hình bảng ánh xạ thực hiện các phép tính bình thường/tính toán và lưu trữ chúng trong cơ sở dữ liệu, dữ liệu được lưu trữ này có thể lỗi thời ngay lập tức.

Mỗi lần mô hình chuẩn hóa này được truy cập (qua quản trị viên), tôi muốn nó thực hiện bình thường trên dữ liệu từ các mô hình khác từ đầu (để nó có thể hiển thị dữ liệu cập nhật nhất) và hoạt động giống như bình thường mô hình sẽ dưới quyền quản trị như Hiển thị chế độ xem danh sách và chế độ xem chi tiết cho mỗi hàng.

Chỉnh sửa sau khi trả lời Thần đạo của:

@Shintoist Cảm ơn đã thanh toán bù trừ những điều trên và cung cấp một cách tiếp cận sử dụng được. Tôi vừa mới triển khai nó nhưng đánh một bức tường nhỏ cuối cùng :)

@skirmantas: Có, các tính toán nằm trong một đối tượng riêng biệt. Đối tượng này đang được chuyển vào chế độ xem tùy chỉnh.

Vấn đề: Một vấn đề là dưới admin.py, tôi đã tạo một mô hình lớp cho đối tượng này (không kế thừa mô hình.Model) để chế độ xem tùy chỉnh của tôi có thể thay đổi chế độ xem và thay đổi của danh sách thay đổi. Sau đó, tôi sử dụng admin.site.register() để đăng ký lớp mô hình này và modeladmin. Nhưng, kể từ khi mô hình này không phải là một mô hình django ở tất cả (vì nó là một đối tượng python độc lập trong bộ nhớ) admin.site.register() ném một "loại" đối tượng không thể lặp lại "lỗi. Tôi không muốn sử dụng url.py thay vì admin.py vì nó có nghĩa là cho giao diện người dùng trong khi Im đang cố gắng quản lý chương trình phụ trợ.

+1

Tôi hiểu bạn muốn sử dụng quản trị viên, nhưng đối với nhu cầu của bạn, đó là cách thực hiện rất vòng quanh. Bạn có thể không chỉ ghi đè lên mẫu quản trị với một liên kết ở đâu đó trên trang tới url sử dụng chế độ xem bạn đã viết không? Bằng cách đó nó sẽ là "trong" admin. Django sẽ tự động tìm kiếm các mẫu ghi đè các nội dung được tạo sẵn. Nếu không tôi đề nghị bạn đi với giải pháp của Tomasz Zielinski. –

+0

@tomas. Nếu tôi tạo mô hình bình thường hóa để ánh xạ tới một bảng trong bộ nhớ, nó sẽ không tĩnh. Ý tôi là, mô hình khi được mở, tìm nạp dữ liệu mới nhất từ ​​các mô hình khác, bình thường hóa/xử lý dữ liệu đó và hiển thị một danh sách. Bây giờ trong thời gian có nghĩa là, nếu ai đó chỉnh sửa các mô hình khác, các mô hình này sẽ không hiển thị trong mô hình chuẩn hóa cho đến khi máy chủ khởi động lại (sẽ tải lại bảng bộ nhớ). – sysasa

+0

Tôi cũng muốn thêm, thực hiện django của tôi đã sử dụng ba cơ sở dữ liệu, một dữ liệu kế thừa (để tôi có thể di chuyển nó sang hệ thống mới), một SQLlite để chạy thử nghiệm thông qua đồ đạc và thứ ba, cơ sở dữ liệu chính. Điều này cũng có nghĩa là, tôi sẽ thêm một cơ sở dữ liệu thứ tư chỉ vì một mô hình. – sysasa

Trả lời

0

hmmm. Cảm ơn sự giúp đỡ của bạn tất cả mọi người.Các giải pháp tôi đã đưa ra (với sự giúp đỡ của bạn ofcourse) như sau:

Tôi có hai mẫu tùy chỉnh:

my_model_list.html 
    my_model_detail.html 

Dưới 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) 

Dưới django url chính .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)) 
) 

Như bạn đã nhận thấy, tôi phải chèn mẫu url vào tệp url.py của mình. Tôi không biết nếu đó là cách tốt nhất để làm điều đó, như tôi nghĩ, tập tin url.py không có nghĩa là cho các trang liên quan đến quản trị viên. Nó chỉ dành cho lối vào trang web.

2

Tại sao có mô hình? Tham khảo các phép tính của bạn trong chế độ xem, viết mẫu cho nó và yêu cầu đăng nhập quản trị viên để truy cập nó. Điều đó sẽ tạo lại dữ liệu chuẩn hóa này chỉ khi bạn tải trang và sẽ chỉ tồn tại trong bộ nhớ, tiết kiệm tài nguyên của bạn.

+4

'Đặt các phép tính của bạn trong một chế độ xem ' Đó là điều tồi tệ nhất bạn có thể làm. Nó sẽ dẫn đến mã không đọc được và không thể đọc được. Số lượt xem phải được giữ tối giản. Bất kỳ tính toán nào cũng phải được thực hiện ở một nơi khác. Biểu mẫu hoạt động tốt để phân tích dữ liệu yêu cầu. Tính toán có thể được thực hiện trong vòng những người giúp đỡ. – Ski

+1

Làm rõ cho bạn. –

+0

Tôi đã chỉnh sửa câu hỏi của mình. Xin vui lòng xem ở trên – sysasa

6

Điều gì về việc sử dụng nhiều cơ sở dữ liệu và định cấu hình một trong số chúng để sử dụng các bảng trong bộ nhớ?

Đối với MySQL nó sẽ trông như thế này:

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

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

Lưu ý rằng bạn chỉ cần sử dụng SET storage_engine khi tạo bảng, nhưng nó có thể là nó không thêm quá nhiều chi phí nào đối với trường hợp sử dụng của bạn.

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

+0

bạn đánh tôi đến cú đấm. Mặc dù tôi đã thực hiện nó trong SQLite. – JudoWill

+0

@JudoWill: Đúng, SQLite cũng là một cách để đi. Cá nhân tôi thích sử dụng cùng một DBMS cho tất cả các công việc, chỉ để ở bên an toàn trong trường hợp một số không tương thích. Điều này, tuy nhiên, chủ yếu là mối quan tâm kiểm tra đơn vị. –

+0

Nếu tôi tạo mô hình chuẩn hóa để ánh xạ tới một bảng trong bộ nhớ, nó sẽ không tĩnh. Ý tôi là, mô hình khi được mở, tìm nạp dữ liệu mới nhất từ ​​các mô hình khác, bình thường hóa/xử lý dữ liệu đó và hiển thị một danh sách. Bây giờ trong thời gian trung bình, nếu ai đó chỉnh sửa các mô hình khác, các mô hình này sẽ không hiển thị trong mô hình chuẩn hóa cho đến khi máy chủ khởi động lại (sẽ tải lại bảng bộ nhớ) – sysasa

1

Tùy thuộc vào độ phức tạp những "tính toán" là, có vẻ như bạn muốn có một tùy chỉnh database view (được hỗ trợ, tôi tin rằng, bằng cách SQLite, MySQL, Postgres, và Oracle, ít nhất) sử dụng kết hợp với một mô hình với Meta.managed=False.

Nếu bạn may mắn, bạn sẽ có thể nhận miền Nam để tạo nó cho bạn khi di chuyển, nhưng dường như miền Nam không hỗ trợ chế độ xem.

Các vấn đề liên quan