django rest返回包含过滤器

时间:2016-08-15 08:10:34

标签: python django django-models django-views django-rest-framework

我是Django休息的新手,我正在尝试返回必须使用两个查询集的响应: 第一个用于特定项目,第二个用于此项目中的特定用户:

serializers.py

class ProjectFiltersSerializer(serializers.ModelSerializer):
    class Meta:
        model= Project
        fields = ('id', 'title','users')

views.py

class FiltersDetail(APIView):
    """
    Retrieve filters instance.
    """
    def get_project(self, project_pk):
        try:
            return models.Project.objects.filter(pk=project_pk)
        except Snippet.DoesNotExist:
            raise Http404

    def get_returning_customers(self, project_pk):
        return [(u.pk, u"%s %s" % (u.first_name, u.last_name)) for u in User.objects.filter(return=1)]

    def get(self, request, project_pk, format=None):
        snippet = self.get_project(project_pk) | self.get_returning_customers(project_pk)
        serializer = ProjectFiltersSerializer(snippet, many=True)
        return Response(serializer.data)

我得到“无法在两种不同的基础模型上组合查询”。 这是正确的方法吗?

由于

2 个答案:

答案 0 :(得分:2)

您可以使用嵌套序列化程序。有关详细信息:http://www.django-rest-framework.org/api-guide/relations/#nested-relationships

答案 1 :(得分:0)

创建一个嵌套的序列化程序(注意它不是模型序列化程序)

class ProjectCustomerSerializer(serializers.Serializer):
    users = UserSerializer(many=True)
    project = ProjectSerializer()
但是,UserSerializer和ProjectSerializer可以是ModelSerializers。然后在视图中:

def get(....):
   serializer = ProjectCustomerSerializer(data={
    'users': self.get_returning_customers(project_pk),
    'project': self.get_project(project_pk),
   })
   return Response(serializer.data)

还有另外一种方式。您可以在项目模型上添加一个方法(get_returning_customers()),然后在ProjectSerializer上添加一个名为returning_customers = serializer.ListField(source='get_returning_customers')

的字段

希望这有帮助