在Django DRF串行化器响应中包含不需要重复每个条目的附加数据?

monwx1rj  于 2023-05-01  发布在  Go
关注(0)|答案(2)|浏览(96)

我们的Django项目发送GeoFeatureModelSerializer响应,我们希望在此响应中包含一个附加值以供JS访问。我们在www.example中找到了如何做到这一点 www.example.com

from rest_framework_gis import serializers as gis_serializers
from rest_framework import serializers as rest_serializers
from core.models import Tablename

class MarkerSerializer(gis_serializers.GeoFeatureModelSerializer):
    new_value = rest_serializers.SerializerMethodField('get_new_value')

    def get_new_value(self, foo): return True

    class Meta:
        fields = ("date", "new_value")
        geo_field = "geom"
        model = Tablename

JS可以通过geojson.features[0].properties.new_value获得这个值,其中const geojson = await response.json(),但它不必要地添加到每个条目中。我们希望它只包含一次,这样JS就可以通过newResponse.new_value之类的东西访问它,现有的功能可以通过newResponse.geojson或类似的东西继续获取相同的数据。
我们如何在这个响应中包含一个附加值?我们以为可能是wrapping our serializer in another,但他们似乎在问一个我们不明白的不同的事情。我们能把这个附加上去吗?在序列化器中,我们可以在某个地方做类似newResponse = {'new_value': new_value, 'geojson': geojson}的事情吗?
我们已经对the Django Rest Framework serializers docs进行了挖掘,但无法解决这个问题,所以也许我们遗漏了一些东西。其他SO threads似乎只询问为每个条目添加数据。
编辑:我们应该提到我们正在使用 www.example.com ,看起来像:

class MarkerViewSet(viewsets.ReadOnlyModelViewSet):
    bbox_filter_field = "location"
    filter_backends = (filters.InBBoxFilter,)
    queryset = Marker.objects.all()
    serializer_class = MarkerSerializer
u3r8eeie

u3r8eeie1#

我认为你需要在视图中处理,而不是在序列化器中处理。

geojson = MarkerSerializer(queryset, many=True)
response = {
  "new_value": new_value,
  "geojson": geojson
}
return Response(response)

如果仍然需要在序列化程序中处理,则需要创建另一个自定义序列化程序。

class CustomSerializer(serializers.Serializer)
   new_value = SerializerMethodField()
   geojson = MarkerSerializer(many=True)

# view.py
serializer = CustomSerializer({"geojson": queryset})
hiz5n14c

hiz5n14c2#

您可以使用get_foo()对带有SerializerMethodField的自定义字段。

from rest_framework.serializers import SerializerMethodField
...

class MarkerSerializer(gis_serializers.GeoFeatureModelSerializer):
    new_value = SerializerMethodField()

    def get_new_value(self):
        return True

    class Meta:
        fields = ("date", "new_value")
        geo_field = "geom"
        model = Tablename

相关问题