django - 验证实例是否存在 django
问题描述
我正在 DRF 上构建一个 REST Api。我有一个来自 rest_framework.viewsets 的 ModelViewSet 端点。
我有一个帖子和一个评论模型。每条评论都属于一个帖子。所以我定义了 2 个端点,如下所示:
1) router.register(r"posts", views.PostView
2) router.register(r"(?P<pk>[^/.]+)/comments", views.CommentView
它们都继承自 ModelViewSet,因此我可以对它们执行 CRUD 操作。
我对第二个端点有疑问。由于我们为帖子创建评论,因此我从 posts/int:pk/comments 中获得了一个帖子 pk。但问题是当我在此端点上执行 GET 请求时,它会返回所有评论的列表,但我需要那些属于帖子(url 中的 ID)。当我尝试在此端点上发出 POST 请求时,如果帖子不存在,它会引发 DoesNotExist 错误,这是合乎逻辑的。
到目前为止我所做的是:
- 重新定义了 get_queryset() 以仅检索属于特定帖子的对象。如果帖子不存在,它会返回一个空列表(尽管我认为它应该引发 404)
- 在我的序列化程序中重新定义 validate() 以检查帖子是否存在。如果没有则返回 404
但是当我检查posts/int:pk/comments/int:pk 上的PUT、DELETE、PATCH 方法时,它也不会考虑post 实例,即即使post 不存在,它也会允许这些操作我错了相信。
ModelViewSet 类中是否有一个方法可以在每个请求上触发并检查 post 实例是否存在?这样我就不必为了检查它而重新定义每个 CRUD 方法。
编辑
评论视图
class CommentView(ModelViewSet):
queryset = Comment.objects.all()
serializer_class = CommentSerializer
lookup_url_kwarg = 'pk2'
def get_queryset(self):
queryset = Comment.objects.filter(post=self.kwargs.get('pk'))
return queryset
def perform_create(self, serializer, **kwargs):
post = get_object_or_404(Post, pk=self.kwargs.get('pk'))
serializer.save(author=self.request.user, post=post)
解决方案
也许看看drf-nested-routers package。
如果它不能解决您的问题,也许您想要的是标准路由器注册:
router.register(r"posts", views.PostView)
router.register(r"comments", views.CommentView)
然后在列出评论时使用django-filter 之/comments/?post=<id>
类的包通过查询参数进行过滤: . 创建评论时,只需在请求正文中发送帖子 ID(不要忘记在 CommentSerializer 中包含“帖子”字段)
推荐阅读
- c++ - 这个程序接受用户输入,应该使用bubbleSort对其进行排序,但它输出字母和数字,我不知道为什么
- php - mPDF v8.0.4 - setProtection 功能未按预期工作
- css - 如何将 FAB(材质 UI)应用到 CSS 网格中的 2 列?
- pandas - 仅使用 2 列中的某些值的多级索引
- sql - 在 pl/pgsql-while 循环中更新单行表
- ios - ScrollView 内的 SwiftUI LazyHStack TabView 被隐藏
- c# - 内嵌 Blazor 组件创建/组件内绑定的可见性
- mongodb - 如何在 studio3T 中将 mongodb 与 .cer 文件连接起来
- javascript - 在 JS 中从 Wikidata 解析 ISO-Date
- flutter - 我的 vscode 括号对和颤振指南是分开的。我该如何解决?