gpt4 book ai didi

django - DRF : Manipulating serializer field layout

转载 作者:行者123 更新时间:2023-12-04 23:49:11 25 4
gpt4 key购买 nike

我有一个代表房子的模型:

class House(models.Model):
name = models.CharField(...)
long = models.FloatField(...)
lat = models.FloatField(...)

和一个序列化程序,以最基本的表示形式返回房屋列表:
class HouseSerializer(serializers.ModelSerializer):
class Meta:
model = House
fields = ('id', 'name')

和 View
class HouseList(generics.ListAPIView):
queryset = House.objects.all()
serializer_class = HouseSerializer

这工作正常。我可以访问 /api/house/我看到了房屋的 json 列表:
{ 
'id': 1,
'name': 'Big House'
},
{
'id': 1
'name': 'Small House',
}...

现在我想在 /api/maps/markers/ 创建第二个 View /资源将我的房屋作为以下格式的 Google-Map-Friendly 标记列表返回:
{ 
'id': 1,
'long': ...,
'lat': ...,
'houseInfo': {
'title': "Big House",
}
} ...

我可以预见两种方法:
  • 作为单独的序列化程序执行此操作(使用与以前相同的 View )并映射出替代字段布局。
  • 将此作为单独的 View 执行(使用与以前相同的序列化程序)并在创建 Response 之前简单地布置字段

  • 但在这两种方法中,我都不清楚如何去做,也不清楚哪种方法更可取?

    最佳答案

    答案 1

    在我看来,您需要两者 - 不同的 View 和序列化程序。

    仅仅因为 View 端点不是第一个的子 url,所以它们不相关 - 不同的 View ,即使它们使用相同的模型。

    和不同的序列化器 - 因为你有不同的字段布局。

    不太确定你的情况有多复杂,但任何代码重复都可以通过混合来解决。

    答案 2

    根据用例:

  • 如果您还需要使用相同的结构体写入数据,则需要定义自己的字段类并正确处理解析
  • 如果它只是读取数据,你应该没问题:
    class HouseGoogleSerializer(HouseSerializer):
    houseInfo = serializers.SerializerMethodField('get_house_info')

    class Meta:
    model = House
    fields = [...]

    def get_house_info(self, obj):
    return {'title': obj.name}

    哪里HouseSerializer是您的基本房屋序列化程序。
  • 关于django - DRF : Manipulating serializer field layout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27046595/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com