Данные из представления в сериализатор в django rest api - PullRequest
0 голосов
/ 25 августа 2018

Я некоторое время борюсь с этой проблемой.

Хорошо, вот мой сериализатор:

from rest_framework import serializers
from happytourist.models import PointsInterestData

class PointsInterestSerializer(serializers.ModelSerializer, serializers.Serializer):
    distance = serializers.IntegerField(default=None)

    class Meta:
        model = PointsInterestData
        fields = ('name', 'latitude', 'longtitude', 'distance')
        read_only_fields = fields

from rest_framework import generics
from .serializers import PointsInterestSerializer
from happytourist.models import PointsInterestData

class PointsInterestList(generics.ListCreateAPIView, generics.ListAPIView):
    serializer_class = PointsInterestSerializer


    def get_queryset(self):
        queryset = PointsInterestData.objects.all()
        return queryset

    def create(self, request, *args, **kwargs):
        user_latitude = request.POST.get('latitude')
        user_longtitude = request.POST.get('longtitude')
        radius = request.POST.get('radius')
        usergeodata = {'latitude': user_latitude, 'longtitude': user_longtitude, 'radius': radius}
        return usergeodata

    def get_coordinates(self):
        latitude = PointsInterestData.objects.model.latitude
        longtitude = PointsInterestData.objects.model.longtitude
        geodata = {"latitude": latitude, "longtitude": longtitude}
        return geodata

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

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

все в порядке, вот что я сделал:

вид:

Класс PointsInterestList (generics.ListCreateAPIView, generics.ListAPIView):

def get_queryset(self):
    queryset = PointsInterestData.objects.all()
    return queryset

def distancecalc():
    return 4

def get_serializer_context(self):
    distance_result = PointsInterestList.distancecalc()
    context = super(PointsInterestList, self).get_serializer_context()
    context.update({'distance': distance_result})
    return context

serializer_class = PointsInterestSerializer

сериализатору:

класс PointsInterestSerializer (serializers.ModelSerializer, serializers.Serializer): distance = serializers.SerializerMethodField (по умолчанию = Нет)

def get_distance(self, obj):
    distance_view = self.context.get('distance')
    return distance_view

class Meta:
    model = PointsInterestData
    fields = ('name', 'latitude', 'longtitude', 'distance')
    read_only_fields = fields
0 голосов
/ 26 августа 2018

Если я правильно понял, вы можете использовать SerializerMethodField, и вы можете получить доступ к данным из поля зрения self.context.

class PointsInterestSerializer(serializers.ModelSerializer):
    distance = <b>serializers.SerializerMethodField(method_name='distancecalc')

    def distancecalc(self, pid_obj):
        # your logic
        context_from_view = self.context
        return 0  # or 1</b>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...