【问题标题】:How to get request params in Django rest framework on ListCreateAPIView如何在 ListCreateAPIView 上的 Django 休息框架中获取请求参数
【发布时间】:2020-07-05 09:36:38
【问题描述】:

我正在使用 Django Rest Framework 和 Swagger 创建一个私人消息应用程序来记录 API。我是这个框架的新手,我不确定 ListCreateAPIView 是否是正确的方法。我需要以下端点:

  • 列出所有给定发送者和接收者的消息。
  • 根据发件人和收件人发布消息。
  • 删除给定发送者和接收者的消息。

我的问题是如何从 URL 中获取发送者 ID 和接收者 ID?

这是我的代码,欢迎对包括序列化程序和模型在内的每个部分进行任何更改。提前致谢。

    class Message(models.Model):
        sender = models.ForeignKey(
            UserProfile, on_delete=models.CASCADE, related_name='sender')
        receiver = models.ForeignKey(
            UserProfile, on_delete=models.CASCADE, related_name='receiver')
        message = models.CharField(max_length=1200)
        createdAt = models.DateTimeField(auto_now_add=True)
        is_read = models.BooleanField(default=False)
    
        def __str__(self):
            return self.message
    
        class Meta:
            ordering = ('createdAt',)
    class MessageSerializer(serializers.ModelSerializer):
        """For Serializing Message"""
        sender = serializers.SlugRelatedField(
            many=False, slug_field='username', queryset=UserProfile.objects.all())
        receiver = serializers.SlugRelatedField(
            many=False, slug_field='username', queryset=UserProfile.objects.all())
    
        class Meta:
            model = Message
            fields = ['sender', 'receiver', 'message', 'createdAt']
class MessageViewSet(ListCreateAPIView):

    serializer_class = MessageSerializer
    queryset = Message.objects.all()

    def list(self, request, *args, **kwargs):
        queryset = Message.objects.all()
        serializer = MessageSerializer(queryset)
        print(self.request.data)
        print(kwargs)
        return Response(serializer.data)
router = DefaultRouter()
router.register('messages', MessageViewSet.as_view(), basename='messages')

urlpatterns = [
    path('', include(router.urls)),
]

【问题讨论】:

  • 如果以下答案帮助您投票并接受它作为答案。

标签: python django django-rest-framework


【解决方案1】:

您可以像这样访问视图中的查询参数

self.request.query_params.get('your_key_name', None)

这是 REST 框架文档的摘录

request.query_params 是更正确命名的同义词 request.GET。 为了清楚您的代码,我们建议使用request.query_params 而不是 Django 的标准 request.GET。这样做将有助于保持 您的代码库更加正确和明显 - 任何 HTTP 方法类型都可能 包括查询参数,而不仅仅是 GET 请求。

【讨论】:

  • 我将 urls.py 代码更改为 urlpatterns = [ #path('', include(router.urls)), path('messages/<sender_id>/<receiver_id>', MessageViewSet.as_view()), ] ` print(self.request.query_params.get('sender_id', None)) print(self.request.query_params.get('receiver_id' , None)) print(request.query_params.get('sender_id', None)) print(request.query_params.get('receiver_id', None)) ` 而且只得到 None
  • @FranciscoMartin 这些不是查询参数。尝试签入kwargsargs
猜你喜欢
  • 1970-01-01
  • 2020-10-27
  • 2016-11-11
  • 1970-01-01
  • 1970-01-01
  • 2020-02-01
  • 2021-05-23
  • 2013-04-08
相关资源
最近更新 更多