DRF:操作序列化器字段布局

Tim*_*ony 4 django django-rest-framework

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

class House(models.Model):
    name = models.CharField(...)
    long = models.FloatField(...)
    lat = models.FloatField(...)
Run Code Online (Sandbox Code Playgroud)

和一个序列化器,以最基本的表示形式返回房屋列表:

class HouseSerializer(serializers.ModelSerializer):
    class Meta:
        model = House
        fields = ('id', 'name')    
Run Code Online (Sandbox Code Playgroud)

和观点

class HouseList(generics.ListAPIView):
    queryset = House.objects.all()
    serializer_class = HouseSerializer
Run Code Online (Sandbox Code Playgroud)

这很好用.我可以访问/api/house/,我看到一个json的房屋列表:

{ 
    'id': 1,
    'name': 'Big House'
},
{
    'id': 1
    'name': 'Small House',
}...
Run Code Online (Sandbox Code Playgroud)

现在我想创建第二个视图/资源/api/maps/markers/,返回我的房子作为格式的Google-Map-Friendly标记列表:

{ 
    'id': 1,
    'long': ...,
    'lat': ...,
    'houseInfo': {
        'title': "Big House",
    }
} ...
Run Code Online (Sandbox Code Playgroud)

我可以预见两种方法:

  • 执行此操作作为单独的序列化程序(使用与以前相同的视图)并映射出替代字段布局.
  • 将此作为单独的视图(使用与以前相同的序列化程序)执行,并在创建之前简单地布局字段 Response

但是我没有采用任何方法,我明白如何处理它,哪种方法更可取?

mar*_*dev 5

答案1

在我看来你需要两者 - 不同的视图和序列化器.

仅仅因为视图端点不是第一个的子网址,所以它们不相关 - 不同的视图,即使它们使用相同的模型.

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

不确定你的情况有多复杂,但无论如何,任何代码重复都可能由mixin解决.

答案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}
    
    Run Code Online (Sandbox Code Playgroud)

    HouseSerializer您的基本房屋序列化器在哪里.