Django rest framework 函数基础视图如何通过字符串而不是 id 获取对象

Django rest framework function base view how to get object by string not id

问题:我正在尝试这样的路径 --> path('Image/<str>', views.getImage, name='imageCategory'),

按类别获取图像过滤器 --> http://127.0.0.1:8000/Image/TV

#-->Model.py
from django.db import models


class Post(models.Model):
    Topic = models.CharField(max_length=250, default='')
    Desc = models.CharField(max_length=750, default='')
    Link = models.TextField(default='')

    def __str__(self):
        return str(self.Topic)


class Category(models.Model):
    categoryName = models.CharField(max_length=50, default='')

    def __str__(self):
        return str(self.categoryName)


class PostImage(models.Model):
    post = models.ForeignKey(
        Post, on_delete=models.CASCADE, null=True, related_name='post_name')
    category = models.ForeignKey(
        Category, on_delete=models.CASCADE, null=True, related_name='category_name')
    images = models.FileField(upload_to='images/')

    def __str__(self):
        return str(self.post)

#-->Serializer.py
from rest_framework.serializers import ModelSerializer
from rest_framework import serializers
from .models import Post, PostImage


class BlogSerializer(ModelSerializer):
    class Meta:
        model = Post
        fields = '__all__'


class ImageSerializer(ModelSerializer):
    topic_link = serializers.CharField(source='post.Link', read_only=True)
    Category = serializers.CharField(source='category', read_only=True)

    class Meta:
        model = PostImage
        fields = '__all__'

#-->view.py
from django.shortcuts import render
from rest_framework.decorators import api_view
from rest_framework.response import Response
from .models import Post, PostImage
from .Serializer import BlogSerializer, ImageSerializer
# Create your views here.


@api_view(['GET'])
def getNames(request):
    Blog = Post.objects.all()
    serializer = BlogSerializer(Blog, many=True)
    return Response(serializer.data)


@api_view(['GET'])
def getName(request, pk):
    Blog = Post.objects.get(id=pk)
    serializer = BlogSerializer(Blog, many=False)
    return Response(serializer.data)

#my problem part

@api_view(['GET'])
def getImage(request):
    image = PostImage.objects.get(Category=request.Category)
    serializer = ImageSerializer(image, many=True)
    return Response(serializer.data)

#-->urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('blogs/', views.getNames, name='blog'),
    path('blogs/<pk>', views.getName, name='blog'),
    path('Image/', views.getImage, name='image'),
    path('Image/<str>', views.getImage, name='imageCategory'),
]

首先需要在urls.py中设置参数名称。

urlpatterns = [
    ...
    path('Image/', views.getImages, name='image'),
    path('Image/<str:category>', views.getImage, name='imageCategory'),
]

这里的category应该是Category模型的categoryName值。 接下来,在 views.py 中,您需要将该参数传递给 getImage 函数。 并且对于没有分类的情况还需要添加getImages函数

@api_view(['GET'])
def getImage(request, category):
    image = PostImage.objects.filter(category__categoryName=category)
    serializer = ImageSerializer(image, many=True)
    return Response(serializer.data)

@api_view(['GET'])
def getImages(request):
    image = PostImage.objects.all()
    serializer = ImageSerializer(image, many=True)
    return Response(serializer.data)

希望对您有所帮助。