【问题标题】:How to read data, apply a function and return the result with Django REST Framework?如何使用 Django REST Framework 读取数据、应用函数并返回结果?
【发布时间】:2016-12-29 16:30:59
【问题描述】:

考虑一个简单的任务来计算“y = ax + b”,其中“a”和“b”由模型给出,“x”由用户通过 API 请求给出,例如 http://someurl .com/api/15,其中 x=15。

通常,API 会以 JSON 格式返回“a”和“b”。但是,相反,我想在服务器上求解这个方程,只返回“y”。但是,我无法弄清楚如何从 URL 中获取“x”以及将最后一个函数放置在何处以将“y”返回给 JSON。有什么想法吗?

models.py:

from django.db import models

class SimpleEquation(models.Model):
    a = models.IntegerField()
    b = models.IntegerField()

serializers.py:

from rest_framework import serializers
from .models import SimpleEquation

class SimpleEquationSerializer(serializers.ModelSerializer):
    class Meta:
        model = SimpleEquation
        fields = ('a','b') # Should return 'y' instead

views.py:

from rest_framework import generics
from .serializers import SimpleEquationSerializer

class Results(generics.ListAPIView):
    queryset = SimpleEquation.objects.all()[0]
    serializer_class = SimpleEquationSerializer

到目前为止我的愚蠢功能:

def the_function(request):
    x = SOME_REQUEST_GET_METHOD
    pars = SimpleEquation.objects.all()[0]
    a = pars.a
    b = pars.b
    y = a*x + b
    return y

【问题讨论】:

  • 您尝试使用通用 ListAPIView 是否有原因?它不完全适合您的用例。
  • 你是对的。 RetrieveAPIView 可能会更好。
  • 你最后用了什么? @ErickDamasceno

标签: python json django django-rest-framework


【解决方案1】:

使用Serializer Method Field

from rest_framework import serializers
from .models import SimpleEquation

class SimpleEquationSerializer(serializers.ModelSerializer):

    y = serializers.SerializerMethodField('get_y')

    class Meta:
        model = SimpleEquation
        fields = ('y')

    def get_y(self, obj):
        x =  self.context['request'].x
        y = obj.a*x + obj.b  # obj comes from the queryset from view
        return y

【讨论】:

  • 谢谢阿斯温。它还没有工作,但我相信这个 SerializerMethodField 可能更接近我正在寻找的答案。
【解决方案2】:

URL dispatcher 将捕获该值并将其传递给视图。这样的事情可能会奏效:

URLconf

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^regression/[+-]?\d+.\d+?/$', views.regression),
]

views.py

def regression(request, x)
    x = float(x)
    pars = SimpleEquation.objects.all()[0]
    a = pars.a
    b = pars.b
    y = a*x + b
    return y

【讨论】:

    猜你喜欢
    • 2021-07-18
    • 2018-10-19
    • 2014-10-27
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 2015-07-12
    • 2020-01-16
    相关资源
    最近更新 更多