MultipleObjectsReturned ошибка в Django, но я хочу, чтобы несколько объектов были возвращены - PullRequest
0 голосов
/ 29 сентября 2019

Используя Django REST Framework, я создал URL, который отображается на страницу с файлом JSON, содержащим все объекты в моей базе данных.

Я хочу сделать то же самое, но вместо того, чтобы показывать только все объекты, которые мне нужныобъекты, которые соответствуют определенной категории (категория является атрибутом в моей модели).

У меня есть URL, которые показывают файлы 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()

1 Ответ

1 голос
/ 30 сентября 2019

Как я понимаю, вы хотите, чтобы 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-to-url

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...