Django中的MultipleObjectsReturned错误,但我希望返回多个对象

问题描述 投票:0回答:1

使用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()
django django-rest-framework
1个回答
1
投票

据我了解,您希望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

© www.soinside.com 2019 - 2024. All rights reserved.