如何使用 objects.filter() 将字典过滤为 django rest 框架中的 POST 方法
how to use objects.filter() for filtering a dictionary to a POST method in django rest framework
Models.py
class Category(models.Model):
name = models.CharField(max_length=50,null=False, blank=False)
def __str__(self):
return self.name
class Photo(models.Model):
category = models.ForeignKey(Category, on_delete=models.SET_NULL,related_name='category', null= True, blank= False)
image = models.ImageField(null= False, blank = False)
description = models.TextField(null=True, blank=True)
def __str__(self):
return self.description
Serializers.py
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = ['name']
class PhotoSerializer(serializers.ModelSerializer):
category = CategorySerializer(many=False)
class Meta:
model = Photo
fields = ['id','category','image','description']
view.py
from django.http import response
from rest_framework import viewsets
from rest_framework import serializers
from rest_framework.response import Response
from rest_framework.serializers import Serializer
from rest_framework.views import APIView
from .models import Category, Photo
from .serializers import PhotoSerializer
class DisplayAllViewSet(viewsets.ModelViewSet):
queryset = Photo.objects.all()
serializer_class = PhotoSerializer
class DisplayCategoryViseViewSet(APIView):
serializer_class = PhotoSerializer
def post(self, request, format=None):
data = self.request.data
print(data)
category = data['category']
print(category)
print(category['name'])
name=category['name']
queryset = Photo.objects.filter(category=name)
serializer = PhotoSerializer(queryset, many=True)
return Response(Serializer.data)
urls.py
from re import I
from django.db import router
from django.urls import path
from django.conf.urls import include
from rest_framework import routers
from .views import DisplayAllViewSet, DisplayCategoryViseViewSet
router = routers.DefaultRouter()
router.register('allImages',DisplayAllViewSet)
urlpatterns = [
path('', include(router.urls)),
path('category',DisplayCategoryViseViewSet.as_view()),
]
在 Postman 中:GET 请求
http://127.0.0.1:8000/gallery/allImages
[
{
"id": 1,
"category": {
"name": "Sirsi"
},
"image": "http://127.0.0.1:8000/sunset.jpg",
"description": "Sunset view point"
},
{
"id": 2,
"category": {
"name": "Chickmangluru"
},
"image": "http://127.0.0.1:8000/tiger.jpg",
"description": "cheeta"
}
]
在 Postman 中:POST 请求
http://127.0.0.1:8000/gallery/category
正文:
{
"category":{
"name":"Sirsi"
}
}
ValueError : 字段 'id' 需要一个数字,但得到 'Sirsi'
我无法使用过滤器映射请求数据(类别=名称)
我知道类别是一个字典,但是我们是否使用字典来映射过滤器中的名称(Sirsi)?使用类别明智地检索 api。
期望的结果:
{
"id": 1,
"category": {
"name": "Sirsi"
},
"image": "http://127.0.0.1:8000/sunset.jpg",
"description": "Sunset view point"
},
提前谢谢你:)
在 DisplayCategoryViseViewSet
的 post
方法中,您需要进行两处更改,如下所示。更改作为注释添加到代码中
class DisplayCategoryViseViewSet(APIView):
serializer_class = PhotoSerializer
def post(self, request, format=None):
data = self.request.data
print(data)
category = data['category']
print(category)
print(category['name'])
name=category['name']
queryset = Photo.objects.filter(category__name=name) #Since you are passing name, if you are passing id of the category, you can give category=name
print(queryset[0])
serializer = PhotoSerializer(queryset, many=True)
return Response(serializer.data) #Typo , Serializer should be serializer
Models.py
class Category(models.Model):
name = models.CharField(max_length=50,null=False, blank=False)
def __str__(self):
return self.name
class Photo(models.Model):
category = models.ForeignKey(Category, on_delete=models.SET_NULL,related_name='category', null= True, blank= False)
image = models.ImageField(null= False, blank = False)
description = models.TextField(null=True, blank=True)
def __str__(self):
return self.description
Serializers.py
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = ['name']
class PhotoSerializer(serializers.ModelSerializer):
category = CategorySerializer(many=False)
class Meta:
model = Photo
fields = ['id','category','image','description']
view.py
from django.http import response
from rest_framework import viewsets
from rest_framework import serializers
from rest_framework.response import Response
from rest_framework.serializers import Serializer
from rest_framework.views import APIView
from .models import Category, Photo
from .serializers import PhotoSerializer
class DisplayAllViewSet(viewsets.ModelViewSet):
queryset = Photo.objects.all()
serializer_class = PhotoSerializer
class DisplayCategoryViseViewSet(APIView):
serializer_class = PhotoSerializer
def post(self, request, format=None):
data = self.request.data
print(data)
category = data['category']
print(category)
print(category['name'])
name=category['name']
queryset = Photo.objects.filter(category=name)
serializer = PhotoSerializer(queryset, many=True)
return Response(Serializer.data)
urls.py
from re import I
from django.db import router
from django.urls import path
from django.conf.urls import include
from rest_framework import routers
from .views import DisplayAllViewSet, DisplayCategoryViseViewSet
router = routers.DefaultRouter()
router.register('allImages',DisplayAllViewSet)
urlpatterns = [
path('', include(router.urls)),
path('category',DisplayCategoryViseViewSet.as_view()),
]
在 Postman 中:GET 请求 http://127.0.0.1:8000/gallery/allImages
[
{
"id": 1,
"category": {
"name": "Sirsi"
},
"image": "http://127.0.0.1:8000/sunset.jpg",
"description": "Sunset view point"
},
{
"id": 2,
"category": {
"name": "Chickmangluru"
},
"image": "http://127.0.0.1:8000/tiger.jpg",
"description": "cheeta"
}
]
在 Postman 中:POST 请求 http://127.0.0.1:8000/gallery/category 正文:
{
"category":{
"name":"Sirsi"
}
}
ValueError : 字段 'id' 需要一个数字,但得到 'Sirsi'
我无法使用过滤器映射请求数据(类别=名称) 我知道类别是一个字典,但是我们是否使用字典来映射过滤器中的名称(Sirsi)?使用类别明智地检索 api。
期望的结果:
{
"id": 1,
"category": {
"name": "Sirsi"
},
"image": "http://127.0.0.1:8000/sunset.jpg",
"description": "Sunset view point"
},
提前谢谢你:)
在 DisplayCategoryViseViewSet
的 post
方法中,您需要进行两处更改,如下所示。更改作为注释添加到代码中
class DisplayCategoryViseViewSet(APIView):
serializer_class = PhotoSerializer
def post(self, request, format=None):
data = self.request.data
print(data)
category = data['category']
print(category)
print(category['name'])
name=category['name']
queryset = Photo.objects.filter(category__name=name) #Since you are passing name, if you are passing id of the category, you can give category=name
print(queryset[0])
serializer = PhotoSerializer(queryset, many=True)
return Response(serializer.data) #Typo , Serializer should be serializer