[英]Filtering django queryset by slug
我也想用 slug 过滤 Post 对象,go 应该如何处理? model 如下所示:
class Post(models.Model):
slug = models.SlugField()
title = models.CharField(max_length=100)
post_json = models.CharField(max_length=100000, blank=True, null=True)
author = models.ForeignKey(User, on_delete=models.CASCADE)
视图看起来像这样。
def load_post_json(request):
obj = Post.objects.filter(author_id=request.user.id)
data = list(obj.values())
return JsonResponse({'posts': data})
在url
,您可以捕获 slug:
# app/urls.py
from django.urls import path
from app.views import load_post_json
urlpatterns = [
# …
path('post/<slug:slug>/', load_post_json, name='post_json'),
# …
]
然后在您看来,您可以在 slug 中进行过滤:
# app/views.py
from django.contrib.auth.decorators import login_required
@login_required
def load_post_json(request, slug):
obj = Post.objects.filter(author_id=request.user.id, slug=slug)
data = list(obj.values())
return JsonResponse({'posts': data})
话虽如此,最好使用Django REST 框架来定义 API。 这具有序列化程序等工具,因此可以更方便地定义视图集以获取项目列表、创建新项目等。
注意:您可以使用
@login_required
装饰器 [Django-doc]将视图限制为经过身份验证的用户的视图。
你的意思是你也想按slug
过滤?
如果您将其作为查询参数提交,只需编写:
def load_post_json(request):
slug_name= request.data.get('slug_name')
obj = Post.objects.filter(author_id=request.user.id, slug=slug_name)
data = list(obj.values())
return JsonResponse({'posts': data})
如果要从 URL 中提取它,请在urls.py
文件中的urlpatterns
上捕获它:
urlpatterns = [
# …
path('post/<slug_name:slug_name>/', load_post_json),
# …
]
然后,在load_post_json
function 中将其作为 function 参数获取:
def load_post_json(request, slug_name):
...
这是另一种替代方式,
# app/urls.py
from django.urls import path
from app.views import load_post_json
urlpatterns = [
# …
path('post/', load_post_json, name='post_json'),
# …
]
和views.py
# app/views.py
from django.contrib.auth.decorators import login_required
@login_required
def load_post_json(request):
slug = request.GET.get('slug', None)
obj = Post.objects.filter(author_id=request.user.id, slug=slug)
data = list(obj.values())
return JsonResponse({'posts': data})
和 url 端点,
/post/?slug=<your slug here>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.