Django Rest Framework:带有多个 slug 的 url
Django Rest Framework: urls with multiple slugs
我正在为我的博客开发 API。每一篇文章都对应一个分类,那么一篇文章的url就是这样:"<slug:slug_category>/<slug:slug_post>/"
。现在我的博客 运行 没有 API 并且以前的路径工作正常。
我需要与 API 具有相同的路径,然后我创建了这个 api 视图:
@api_view(["GET"])
def blogPost_details_apiview(request, slug_post, slug_category):
try:
object = BlogPost.objects.get(slug_post=slug_post, slug_category=slug_category)
except BlogPost.DoesNotExist:
return Response({"Error": {
"code": 404,
"message": "Article not found!"
}},
status=status.HTTP_404_NOT_FOUND)
if request.method == "GET":
serializer = BlogPostListSerializer(object)
return Response(serializer.data)
这是 urls.py 中的代码:path('<slug:slug_category>/<slug:slug_post>/', views.blogPost_details_apiview, name="details-blogpost"),
我看到这个错误:
FieldError at
/api/blog/gis/corso-applicativo-di-base-sistemi-informativi-territoriali/
Cannot resolve keyword 'slug_category' into field. Choices are:
attachment, attachment_id, category, category_id, contents,
description, draft, header_image, highlighted, id, publishing_date,
slug_post, tags, timestamp, title, updating_date
我错了什么?
我正在使用 Django 2.2
编辑:
models.py
class CategoryBase(models.Manager):
category_name = models.CharField(max_length=50unique=True)
slug_category = models.SlugField(unique=True)
def get_absolute_url(self):
return reverse("single_blogcategory", kwargs={"slug_category": self.slug_category})
class BlogPost(models.Manager):
title = models.CharField(max_length=70, unique=True)
slug_post = models.SlugField(max_length=70, unique=True)
header_image = models.CharField(max_length=1000, null=True, blank=True)
description = models.TextField(max_length=200, blank=True)
contents = models.TextField()
draft = models.BooleanField(default=False)
highlighted = models.BooleanField(default=False)
category = models.ForeignKey(BlogCategory,on_delete=models.CASCADE, related_name="related_blogcategory")
tags = models.ManyToManyField(BlogTag,related_name="related_blogtag", verbose_name="Tag")
attachment = models.ForeignKey(FileUpload, on_delete=models.CASCADE, related_name="related_attachment", null=True, blank=True)
publishing_date = models.DateTimeField(default=timezone.now)
updating_date = models.DateTimeField(auto_now=True)
timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)
def get_absolute_url(self):
return reverse("single_blogpost", kwargs={
"slug_post": self.slug_post,
"slug_category": self.category.slug_category,
})
根据发布的模型,slug_category
不在 BlogPost
上,而是在 Category
上。请将您的代码更改为:
object = BlogPost.objects.get(
slug_post=slug_post,
category__slug_category=slug_category,
)
请注意,在第二行中,我们在通过外键连接的 category
字段上查找 slug_category
。
我正在为我的博客开发 API。每一篇文章都对应一个分类,那么一篇文章的url就是这样:"<slug:slug_category>/<slug:slug_post>/"
。现在我的博客 运行 没有 API 并且以前的路径工作正常。
我需要与 API 具有相同的路径,然后我创建了这个 api 视图:
@api_view(["GET"])
def blogPost_details_apiview(request, slug_post, slug_category):
try:
object = BlogPost.objects.get(slug_post=slug_post, slug_category=slug_category)
except BlogPost.DoesNotExist:
return Response({"Error": {
"code": 404,
"message": "Article not found!"
}},
status=status.HTTP_404_NOT_FOUND)
if request.method == "GET":
serializer = BlogPostListSerializer(object)
return Response(serializer.data)
这是 urls.py 中的代码:path('<slug:slug_category>/<slug:slug_post>/', views.blogPost_details_apiview, name="details-blogpost"),
我看到这个错误:
FieldError at /api/blog/gis/corso-applicativo-di-base-sistemi-informativi-territoriali/ Cannot resolve keyword 'slug_category' into field. Choices are: attachment, attachment_id, category, category_id, contents, description, draft, header_image, highlighted, id, publishing_date, slug_post, tags, timestamp, title, updating_date
我错了什么? 我正在使用 Django 2.2
编辑: models.py
class CategoryBase(models.Manager):
category_name = models.CharField(max_length=50unique=True)
slug_category = models.SlugField(unique=True)
def get_absolute_url(self):
return reverse("single_blogcategory", kwargs={"slug_category": self.slug_category})
class BlogPost(models.Manager):
title = models.CharField(max_length=70, unique=True)
slug_post = models.SlugField(max_length=70, unique=True)
header_image = models.CharField(max_length=1000, null=True, blank=True)
description = models.TextField(max_length=200, blank=True)
contents = models.TextField()
draft = models.BooleanField(default=False)
highlighted = models.BooleanField(default=False)
category = models.ForeignKey(BlogCategory,on_delete=models.CASCADE, related_name="related_blogcategory")
tags = models.ManyToManyField(BlogTag,related_name="related_blogtag", verbose_name="Tag")
attachment = models.ForeignKey(FileUpload, on_delete=models.CASCADE, related_name="related_attachment", null=True, blank=True)
publishing_date = models.DateTimeField(default=timezone.now)
updating_date = models.DateTimeField(auto_now=True)
timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)
def get_absolute_url(self):
return reverse("single_blogpost", kwargs={
"slug_post": self.slug_post,
"slug_category": self.category.slug_category,
})
根据发布的模型,slug_category
不在 BlogPost
上,而是在 Category
上。请将您的代码更改为:
object = BlogPost.objects.get(
slug_post=slug_post,
category__slug_category=slug_category,
)
请注意,在第二行中,我们在通过外键连接的 category
字段上查找 slug_category
。