Django Rest框架中的多对多嵌套关系作为列表

时间:2018-04-24 20:32:44

标签: python django django-rest-framework

我正在使用Django Rest Framework构建API,我有两个共享多对多关系的模型。模型是联系人和任务。可以与多个联系人共享任务,联系人可以与其共享许多任务。我也使用手动连接表,而不是Django内置的多对多关系。

在API中,我想让检索任务的方法包括与其共享任务的联系人列表。我目前有办法实现这一目标,但它并不好。序列化的任务有一个属性shared_with,它是一个通过SharedWithSerializer类的相关字段(这是关系的这一方面的ContactTaskJoin序列化程序的版本)。所以输出很笨重。 SharedWithSerializer只有一个属性 - contact - 引用ContactSerializer类。 API返回的示例任务:

{
 'id': 100,
 'shared_with': [
    {
       'contact': {
          'id': 1,
          'name': 'Alice'
       }
    },
    {
       'contact': {
          'id': 2,
          'name': 'Bob'
       }
    }
 ]
}

我想要的是只提供与之共享任务的联系人的简单列表。类似的东西:

 {
 'id': 100,
 'shared_with': [
    {
       'id': 1,
       'name': 'Alice'
    },
    {
       'id': 2,
       'name': 'Bob'
    },
 ]
}

我们非常感谢任何建议。

1 个答案:

答案 0 :(得分:2)

您可以覆盖to_representation上的SharedWithSerializer以将联系人字段展平一级

例如

class SharedWithSerializer(serializers.ModelSerializer):

    def to_representation(self, obj):
        representation = super().to_representation(obj)
        shared_with = representation.pop('shared_with')
        representation['shared_with'] = [entry['contact'] for entry in shared_with]
        return representation

我希望这有助于解决您的问题。如果您还可以发布models.py和serializers.py,我可以根据需要提供更加量身定制的答案。