2015-01-05 15 views
6

Tôi đã viết một ứng dụng học máy ở Django để người dùng có thể chỉ định dưới dạng một số tham số và đào tạo một mô hình. Khi mô hình được đào tạo, tôi muốn phân phát các yêu cầu như:Django và REST API để phục vụ các yêu cầu dựa trên tính toán

curl http://localhost:8000/.../?model_input='XYZ' 

và tôi muốn Django trả về đầu ra của mô hình cho XYZ đầu vào. Mỗi ví dụ tôi thấy từ khung công tác Tastypie hoặc REST xây dựng phản hồi của nó từ một queryset. Làm thế nào tôi có thể tiến hành nếu đáp ứng không phải là kết quả của một queryset mà là kết quả của phép tính thuần trong bộ nhớ? Trong trường hợp của tôi, đáp ứng là kết quả của phép nhân ma trận (mô hình được đào tạo) bởi một vectơ (đầu vào) và kết quả này không được lưu trữ trong một bảng.

Cách được đề xuất để quản lý các yêu cầu đó là gì? Bất kỳ trợ giúp nào được đánh giá cao. Trân trọng, Patrick

+0

Kiểm tra: [Sử dụng Tastypie với nguồn dữ liệu không ORM] (http://django-tastypie.readthedocs.org/en/latest/non_orm_data_sources.html) –

+1

khuyên bạn nên sử dụng DRF trên TP http: //www.django -rest-framework.org/api-guide/views/ – Anentropic

Trả lời

5

Khung Django REST không yêu cầu nguồn mô hình hoặc bộ truy vấn mặc dù nó hoạt động tốt nhất khi làm việc với một trong hai bộ lọc này. It does provide a basic Serializer vì lý do này, as well as basic APIView classes để cho phép thương lượng nội dung được sử dụng trên các chế độ xem dựa trên lớp chuẩn của Django.

Bạn rất có thể sẽ không cần phải sử dụng Serializer trừ khi bạn đang tìm kiếm để tuần tự hóa đối tượng kết quả. Cách sử dụng phổ biến khác cho số Serializer là xác thực dữ liệu đến và chuyển đổi dữ liệu đó thành định dạng mong muốn.

Nếu bạn chỉ muốn trả về giá trị cơ bản (bạn không chỉ định "kết quả của phép nhân ma trận" có thể là gì), thì thậm chí chỉ cần sử dụng chế độ xem cơ bản là thực hiện tất cả các bước . Đối tượng Response mà khung công tác Django REST cung cấp cho phép bạn trả về dữ liệu tùy ý và được chuyển đổi thành một biểu diễn JSON hoặc XML có thể so sánh được một cách tự động. Bạn không bao giờ cần phải gọi json.dumps hoặc ép buộc dữ liệu vào một đại diện cụ thể, đối tượng Response thực hiện tất cả cho bạn.

from rest_framework.response import Response 
from rest_framework import serializers, views 

class IncredibleInputSerializer(serializers.Serializer): 
    model_input = serializers.CharField() 

class IncredibleView(views.APIView): 

    def get(self, request): 
     # Validate the incoming input (provided through query parameters) 
     serializer = IncredibleInputSerializer(data=request.query_params) 
     serializer.is_valid(raise_exception=True) 

     # Get the model input 
     data = serializer.validated_data 
     model_input = data["model_input"] 

     # Perform the complex calculations 
     complex_result = model_input + "xyz" 

     # Return it in your custom format 
     return Response({ 
      "complex_result": complex_result, 
     }) 

Trong ví dụ trên, chúng ta tạo ra một IncredibleInputSerializer đó xác nhận các thông số model_input truy vấn để đảm bảo rằng nó được bao gồm trong yêu cầu. Đây là một ví dụ rất cơ bản, như khung Django REST hỗ trợ thực hiện thêm nhiều thứ vào đầu vào, như chuyển đổi nó thành một số or validating mà nó phù hợp với một định dạng cụ thể.

Tất nhiên, nếu bạn cần tuần tự hóa một đối tượng hoặc danh sách các đối tượng, đó là nơi khung Django REST vượt trội. Nó không phải là một đối tượng mô hình, nó có thể là một đối tượng với thuộc tính hoặc phương thức để lấy dữ liệu, hoặc thậm chí chỉ là một từ điển cơ bản, và khung công tác Django REST sẽ có thể tuần tự hóa nó cho bạn.

+0

Cảm ơn bạn rất nhiều Kevin, câu trả lời của bạn rất được đánh giá cao! Tôi nhận ra rằng đây có thể là một khía cạnh khác của câu hỏi nhưng có cách nào trong ví dụ của bạn để tránh việc tải ma trận mỗi lần yêu cầu được gửi không? Nói cách khác, ma trận - rất lớn - là như nhau cho tất cả các yêu cầu và tôi muốn tải nó một lần duy nhất, khi máy chủ bắt đầu. Trân trọng, Patrick – Patrick

+0

Làm điều đó sẽ đòi hỏi một số loại trạng thái toàn cầu được thiết lập, mà sẽ thay đổi dựa trên nơi bạn cần dữ liệu, nhưng [bạn có thể móc vào sự kiện sẵn sàng của Django] (http://stackoverflow.com/a/16111968/359284) để làm điều đó. –

+0

Cảm ơn bạn đã liên kết Kevin. Sau khi đọc bài viết của Pykler tôi hiểu rằng một số mã có thể được thực hiện khi máy chủ khởi động nhưng tôi vẫn không chắc chắn cách dữ liệu có thể được * chia sẻ *.Dù sao, tôi sẽ áp đặt câu hỏi cụ thể này ở đó. Cảm ơn một lần nữa, Patrick – Patrick

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