从 Django 获取自定义休息数据

Posted

技术标签:

【中文标题】从 Django 获取自定义休息数据【英文标题】:Fetching custom rest data from Django 【发布时间】:2016-02-08 15:11:57 【问题描述】:

我使用 Django 作为服务器端,使用 Angular 作为客户端。

我想从我的 django rest api 后端获取数据。 我看到了很多关于从已经存在的模块中获取数据的教程。但是,如果我想检索由多个模块组合而成的数据怎么办?

例如,我有两个模块预订和俱乐部。我想检索包含来自这两个模块的数据的 json 对象,用于特定的俱乐部 ID。

模块 -

class Club(models.Model):
    name = models.CharField(max_length=1024)
    image_path = models.CharField(max_length=1024)

class Reservation(models.Model):
    club = models.ForeignKey('Club')
    user = models.CharField(max_length=1024)
    is_paid = models.BooleanField(default=False)

序列化器 -

class ReservationSerializer(serializers.ModelSerializer):
    class Meta:
        model = Reservation
        fields  = ('club', 'user')

class ClubSerializer(serializers.ModelSerializer):
    class Meta:
        model = Club
        fields = ('id', 'name', 'surfaces')

视图集 -

class ReservationViewSet(generics.ListAPIView):
    serializer_class = ReservationSerializer
    queryset = Reservation.objects.all()
    filter_backends = (filters.DjangoFilterBackend,)
    filter_fields = ('id', 'club')

class ClubViewSet(generics.ListAPIView):
    queryset = Club.objects.all()
    serializer_class = ClubSerializer
    filter_backends = (filters.DjangoFilterBackend,)
    filter_fields = ('id', 'name')

所以,对于这个例子,我希望当我得到这个 url -http://127.0.0.1:8000/api/initial_data?club=2 它将运行一个执行某些逻辑的 ViewSet,然后返回这种格式的 json -

club_id: 2, reservations: 1:"John", 2:"Doe", 3:"Bob" 

更一般地说 - 我如何返回我自己的自定义 json,其中包含来自多个模块的数据,以及给定的 URL 参数(返回客户端)?

编辑 - 如果我想返回一个简单的 JSON,我应该如何使用 django DRF,考虑到每个视图集都被映射到模型/序列化器的事实? 也许使用简单的 JsonResponse..?

【问题讨论】:

【参考方案1】:

您可以将一个序列化程序定义为另一个序列化程序中的字段

class ReservationSerializer(serializers.ModelSerializer):
    ...

class ClubSerializer(serializers.ModelSerializer):
    reservations = ReservationSerializer(many=True, read_only=True)
    ...

现在 ClubSerializer 将返回每个 Club 内的 Reservations

【讨论】:

呼叫Nested relationships @Serjik 感谢您的快速回复。但我想从那个返回一个更复杂的 json,这只是一个例子。我想返回多个模块组合的数据 @John nop,乐于助人 John:@Serjik 的答案是正确的,并为您指明了正确的方向。如果没有什么可以阻止您从其他模块返回数据模型。实际上,当您对用户有 FK 时,这是一个常见的用例。 @Linovia 请参考我的帖子编辑。我想返回一个包含许多数据类型和值的 json,而不是必要的 Club 和 Reservations 对象。再次感谢您的回复!【参考方案2】:

您可以使用APIView 并覆盖get 方法。

def get(self, request)

club = request.query_params.get('club', None)

"""
Do anything, access data, prepare dictionary or list with result
"""

return Response(result_dictionary_or_list)

【讨论】:

以上是关于从 Django 获取自定义休息数据的主要内容,如果未能解决你的问题,请参考以下文章

Django CMS 自定义插件从 cms_title 加载数据

Django模板从请求或“刷新”单选按钮获取自定义属性

在 django 1.8 中将数据从原始用户模型迁移到自定义用户模型

django不定义model,直接执行自定义SQL

Django自定义分页器

Django(自定义过滤器和自定义标签)