Django Rest Framework: URL с несколькими слизнями - PullRequest
0 голосов
/ 17 марта 2020

Я разрабатываю 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 в / api / blog / gis / corso-applicationativo-di-base-sistemi- informativi-территориально / Не удается разрешить ключевое слово 'slug_category' в поле. Доступны следующие варианты: вложение, идентификатор вложения, категория, идентификатор категории, содержимое, описание, черновик, изображение заголовка, выделенное, идентификатор, дата публикации, тег slug_post, теги, метка времени, заголовок, дата обновления

В чем я не прав? Я использую 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,
                                                })

1 Ответ

1 голос
/ 17 марта 2020

Исходя из опубликованной модели, slug_category не на BlogPost, а на Category. Пожалуйста, измените ваш код на:

object = BlogPost.objects.get(
    slug_post=slug_post,
    category__slug_category=slug_category,
)

Обратите внимание, что во второй строке мы ищем slug_category в полях category, которые связаны через внешний ключ.

...