2009-02-07 25 views
8

Ý tưởng tốt nhất để điền dữ liệu vào mô hình Django từ một nguồn bên ngoài là gì?Làm thế nào để cư trú bên ngoài một mô hình Django?

Ví dụ: Tôi có một mô hình Run và chạy dữ liệu trong một tệp XML, thay đổi hàng tuần.

Tôi có nên tạo chế độ xem và gọi URL xem đó từ cronjob curl (với lợi thế là dữ liệu có thể đọc bất cứ lúc nào, không chỉ khi cronjob chạy) hoặc tạo tập lệnh python và cài đặt tập lệnh đó dưới dạng cron (với DJANGO _SETTINGS _MODULE biến thiết lập trước khi thực hiện kịch bản)?

Trả lời

10

Có cách tuyệt vời để thực hiện một số công việc giống như bảo trì trong môi trường dự án- viết custom manage.py command. Phải mất tất cả các cấu hình môi trường và các công cụ khác cho phép bạn tập trung vào nhiệm vụ cụ thể.

Và tất nhiên gọi trực tiếp bằng cron.

4

Bạn không cần tạo chế độ xem, bạn chỉ cần kích hoạt tập lệnh python với Django environment settings configured thích hợp. Sau đó gọi các mô hình của bạn trực tiếp theo cách bạn muốn nếu bạn đang sử dụng một khung nhìn, xử lý dữ liệu của bạn, thêm nó vào mô hình của bạn, sau đó .save() mô hình vào cơ sở dữ liệu.

+0

Tôi có thể thực hiện việc này từ cả hai phía, lưu từ chế độ xem hoặc lưu từ tập lệnh python. – Marius

+0

Lệnh quản lý tùy chỉnh là giải pháp tốt hơn so với việc tự cài đặt môi trường Django. Xem câu trả lời của Daevaorn. –

2

"tạo tập lệnh python và cài đặt tập lệnh đó dưới dạng cron (với thiết lập biến DJANGO _SETTINGS _MODULE trước khi thực thi tập lệnh)?"

Đầu tiên, hãy chắc chắn để khai báo hình thức của bạn trong một mô-đun riêng biệt (ví dụ forms.py)

Sau đó, bạn có thể viết bộ tải hàng loạt trông như thế này. (Chúng tôi có rất nhiều trong số này.)

from myapp.forms import MyObjectLoadForm 
from myapp.models import MyObject 
import xml.etree.ElementTree as ET 

def xmlToDict(element): 
    return dict(
     field1= element.findtext('tag1'), 
     field2= element.findtext('tag2'), 
    ) 

def loadRow(aDict): 
    f= MyObjectLoadForm(aDict) 
    if f.is_valid(): 
     f.save() 

def parseAndLoad(someFile): 
    doc= ET.parse(someFile).getroot() 
    for tag in doc.getiterator("someTag") 
     loadRow(xmlToDict(tag)) 

Lưu ý rằng có rất ít xử lý độc đáo ở đây - nó chỉ sử dụng cùng một Mẫu và Mẫu làm chức năng xem của bạn.

Chúng tôi đặt các tập lệnh theo lô này bằng ứng dụng Django của chúng tôi, vì nó phụ thuộc vào ứng dụng models.pyforms.py của ứng dụng.

Phần "thú vị" duy nhất là chuyển đổi hàng XML thành từ điển để nó hoạt động liên tục với các biểu mẫu của Django. Ngoài ra, chương trình dòng lệnh này sử dụng tất cả các thành phần Django giống như chế độ xem của bạn.

Có thể bạn sẽ muốn thêm tùy chọn phân tích cú pháp và ghi nhật ký để tạo một ứng dụng dòng lệnh hoàn chỉnh trong số này. Bạn cũng sẽ nhận thấy rằng phần lớn logic là chung chung - chỉ chức năng xmlToDict mới thực sự là duy nhất. Chúng tôi gọi những "Nhà xây dựng" này và có phân cấp lớp để Nhà xây dựng của chúng tôi là tất cả các ánh xạ đa hình từ các tài liệu nguồn của chúng tôi đến các từ điển Python.

+0

Không có lý do nào để không triển khai kiểu kịch bản này dưới dạng lệnh quản lý Django. Nó tích hợp với các lệnh khác trong manage.py, và nó sẽ chăm sóc những thứ như đối số và phân tích cú pháp tùy chọn cho bạn. Thêm "Djangoic". –

2

Tôi đã sử dụng cron để cập nhật DB của mình bằng cả tập lệnh và chế độ xem. Từ quan điểm của cron nó không thực sự quan trọng mà bạn chọn. Tuy nhiên, như bạn đã lưu ý, thật khó để đánh bại sự đơn giản của việc kích hoạt trình duyệt và nhấn vào một URL nếu bạn muốn cập nhật tại một khoảng thời gian không được lên lịch.

Nếu bạn đi theo tuyến đường xem, có thể đáng xem xét một chế độ xem chấp nhận chính tệp XML thông qua HTTP POST. Nếu điều đó có ý nghĩa đối với dữ liệu của bạn (bạn không cung cấp nhiều thông tin về tệp XML đó), nó sẽ vẫn hoạt động từ cron, nhưng cũng có thể chấp nhận tải lên từ trình duyệt - có khả năng cho phép người tạo tệp XML cập nhật DB của mình. Đó là một chiến thắng lớn nếu bạn không phải là người tạo tệp XML, thường là trường hợp trong trải nghiệm của tôi.

+0

tuyệt vời. bất kỳ phương pháp hay nhất nào được đề xuất? – jdcaballerov

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