简体   繁体   English

将基于 Django 通用 class 的 LISTVIEW 转换为 Rest 框架 LISTAPIVIEW

[英]converting Django generic class based LISTVIEW to Rest framework LISTAPIVIEW

I need help to convert the below class-based LISTVIEW to the rest framework LISTAPIVIEW because I want to authenticate users using permission classes simple JWT authentication.我需要帮助将以下基于类的 LISTVIEW 转换为 rest 框架 LISTAPIVIEW,因为我想使用权限类简单 JWT 身份验证来验证用户。 thanks谢谢

class MessagesModelList(ListView):
http_method_names = ['get', ]
paginate_by = getattr(settings, 'MESSAGES_PAGINATION', 500)

def get_queryset(self):
    if self.kwargs.get('dialog_with'):
        qs = MessageModel.objects \
            .filter(Q(recipient=self.request.user, sender=self.kwargs['dialog_with']) |
                    Q(sender=self.request.user, recipient=self.kwargs['dialog_with'])) \
            .select_related('sender', 'recipient')
    else:
        qs = MessageModel.objects.filter(Q(recipient=self.request.user) |
                                         Q(sender=self.request.user)).prefetch_related('sender', 'recipient', 'file')

    return qs.order_by('-created')

def render_to_response(self, context, **response_kwargs):
    user_pk = self.request.user.pk
    data = [serialize_message_model(i, user_pk)
            for i in context['object_list']]
    page: Page = context.pop('page_obj')
    paginator: Paginator = context.pop('paginator')
    return_data = {
        'page': page.number,
        'pages': paginator.num_pages,
        'data': data
    }
    return JsonResponse(return_data, **response_kwargs)

you need to create the below files and and try the following您需要创建以下文件并尝试以下操作

serializer.py序列化器.py

from rest_framework import serializers
from rest_framework.pagination import PageNumberPagination
from .models import MessageModel

class CustomPagination(PageNumberPagination):
    page_size = 500
    page_size_query_param = 'page_size'
    max_page_size = 10000

class MessagesModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MessageModel
        fields = "__all__" #use this if you want all the fields of your model available
        fields = ['field1','field2', etc..] #use this if you want specific fields of your model

views.py视图.py

from .models import MessageModel
from rest_framework import mixins,viewsets
from .serializer import MessagesModelSerializer,CustomPagination

class MessagesModelListView(mixins.ListModelMixin,
                             viewsets.GenericViewSet):
    serializer_class = MessagesModelSerializer
    pagination_class = CustomPagination

    def get_queryset(self):
        if self.kwargs.get('dialog_with'):
            qs = MessageModel.objects \
                .filter(Q(recipient=self.request.user, sender=self.kwargs['dialog_with']) |
                        Q(sender=self.request.user, recipient=self.kwargs['dialog_with'])) \
                .select_related('sender', 'recipient')
        else:
            qs = MessageModel.objects.filter(Q(recipient=self.request.user) |
                                            Q(sender=self.request.user)).prefetch_related('sender', 'recipient', 'file')

        return qs.order_by('-created')

urls.py网址.py

from .views import MessageModelListView
from rest_framework.routers import DefaultRouter

router=DefaultRouter()
router.register('messages', MessagesModelList, 'messages')

This is a basic example of how you can create ListView using DRF.这是一个基本示例,说明如何使用 DRF 创建 ListView。 if you need more customization, please refer the documentation: https://www.django-rest-framework.org/api-guide/generic-views/如果您需要更多定制,请参考文档: https://www.django-rest-framework.org/api-guide/generic-views/

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM