使用Django REST框架,我创建了一个URL,该URL映射到包含JSON文件的页面,该文件包含数据库中的所有对象。
我想做同样的事情,但是我不想显示所有对象,而是只希望匹配特定类别的对象(类别是模型中的属性)。
[我的网址显示的是一个带有单个对象的JSON文件(使用pk属性),但是当我尝试对类别而不是pk执行相同的操作时,出现了MultipleObjectsReturned错误。
我只是在使用REST框架,我尝试使用不同的视图和基于类的视图,但没有解决任何问题。
任何提示或建议都非常感谢,谢谢。
# models.py
class Hardware(models.Model):
name = models.CharField(max_length=25)
category = models.CharField(choices=CATEGORY_CHOICES, max_length=2)
def get_api_url(self):
return api_reverse("category-api-postings:post-rud", kwargs={'category': self.category})
#views.py
class HardwareListView(generics.ListCreateAPIView):
pass
lookup_field = 'pk'
serializer_class = HardwareSerializer
def get_queryset(self):
query = self.request.GET.get("q")
qs = Hardware.objects.all()
if query is not None:
qs = qs.filter(Q(title__icontains=query) | Q(content__icontains=query)).distinct()
return qs
class HardwareRudView(generics.RetrieveUpdateDestroyAPIView):
pass
lookup_field = 'category'
serializer_class = HardwareSerializer
def get_queryset(self):
return Hardware.objects.all()
#urls.py
app_name = 'category-api-postings'
urlpatterns = [
path('', exercise_view),
path('list-api/', HardwareListView.as_view(), name='all'),
path('list-api/<str:category>/', HardwareRudView.as_view(), name='post-rud')
#serializer.py
class HardwareSerializer(serializers.ModelSerializer):
url = serializers.SerializerMethodField(read_only=True)
class Meta:
model = Hardware
fields = [
'url',
'pk',
'name',
'category'
]
read_only_fields = ['user']
def get_url(self, obj):
return obj.get_api_url()
据我了解,您希望URL /list-api/HD/
返回给定类别的所有Hardware
对象。为此,HardwareRudView
必须继承ListAPIView
,而不是RetrieveUpdateDestroyAPIView
。例如,像这样:
class HardwareRudView(generics.ListAPIView):
serializer_class = HardwareSerializer
def get_queryset(self):
category = self.kwargs['category']
return Hardware.objects.filter(category=category)
请参阅相关文档:https://www.django-rest-framework.org/api-guide/filtering/#filtering-against-the-url