RetrieveAPIView执行顺序

# users/views.py
class UserDetailView(RetrieveAPIView): 
    """
    获取用户信息
    """
    serializer_class = UserDetailSerialzier
    permission_classes = [IsAuthenticated]  # 登录后可以查看

    # 重写generics/get_object方法,按照指定对象返回
    # def get_object(self):
    #
    #     return self.request.user

# rest_framework/generics.py
class RetrieveAPIView(mixins.RetrieveModelMixin,
                      GenericAPIView):
    """
    Concrete view for retrieving a model instance.
    """
    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)
# rest_framework/mixin.py
class RetrieveModelMixin(object):
    """
    Retrieve a model instance.
    """
    def retrieve(self, request, *args, **kwargs):
        instance = self.get_object()	
        serializer = self.get_serializer(instance)
        return Response(serializer.data)
# rest_framework/generics.py
        def get_object(self):
        queryset = self.filter_queryset(self.get_queryset())	

        # Perform the lookup filtering.
        lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field

        assert lookup_url_kwarg in self.kwargs, (
            'Expected view %s to be called with a URL keyword argument '
            'named "%s". Fix your URL conf, or set the `.lookup_field` '
            'attribute on the view correctly.' %
            (self.__class__.__name__, lookup_url_kwarg)
        )

        filter_kwargs = {self.lookup_field: self.kwargs[lookup_url_kwarg]}
        obj = get_object_or_404(queryset, **filter_kwargs)

        # May raise a permission denied
        self.check_object_permissions(self.request, obj)

        return obj
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 Django-REST-framework 中,可以通过 Serializer 来实现将两个或多个表的查询结果返回给前端。具体步骤如下: 1. 定义 Serializer ,通过继承 serializers.Serializer 或 serializers.ModelSerializer 来定义序列化器。在序列化器中,需要定义需要返回给前端的字段,以及与其他表的关联关系。 2. 定义视图函数,通过继承 generics.ListAPIView 或 generics.RetrieveAPIView 来定义视图函数。在视图函数中,需要指定查询结果所对应的模型,以及使用的序列化器。 3. 注册 URL,将视图函数与 URL 进行绑定,以便进行访问。 例如,假设有两个模型,分别为 Book 和 Author,它们之间存在外键关系。现在需要将 Book 和 Author 的查询结果返回给前端,可以按照以下步骤进行: 1. 定义序列化器 ```python from rest_framework import serializers from .models import Book, Author class AuthorSerializer(serializers.ModelSerializer): class Meta: model = Author fields = ('id', 'name', 'email') class BookSerializer(serializers.ModelSerializer): author = AuthorSerializer() class Meta: model = Book fields = ('id', 'title', 'author') ``` 在 BookSerializer 中,通过 author = AuthorSerializer() 来指定与 Author 模型的关联关系。这样,在序列化 Book 查询结果时,会同时序列化对应的 Author 对象。 2. 定义视图函数 ```python from rest_framework import generics from .models import Book from .serializers import BookSerializer class BookList(generics.ListAPIView): queryset = Book.objects.all() serializer_class = BookSerializer ``` 在 BookList 视图函数中,指定查询结果对应的模型为 Book,使用的序列化器为 BookSerializer。 3. 注册 URL ```python from django.urls import path from .views import BookList urlpatterns = [ path('books/', BookList.as_view()), ] ``` 将 BookList 视图函数与 '/books/' URL 进行绑定,以便进行访问。当访问 '/books/' URL 时,将返回 Book 和 Author 的查询结果。 需要注意的是,以上代码只是示例,实际情况中可能需要根据具体需求进行修改。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值