我是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)
我得到“无法在两种不同的基础模型上组合查询”。 这是正确的方法吗?
由于
答案 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')
希望这有帮助