【问题标题】:Django REST Framework GET to retrieve rows that have NAME LIKE %NAME%Django REST Framework GET 检索具有 NAME LIKE %NAME% 的行
【发布时间】:2020-10-22 05:01:44
【问题描述】:

所以我有一个表,我想使用 GET 请求进行查询,它应该返回与 %NAME% 匹配的项目,但当前请求返回包含所有条目的完整表,而不是我想要的。

请求

http://localhost:8000/inventory/?name=cookie/

回复

GET /inventory/?name=cookie/
HTTP 200 OK
Allow: POST, OPTIONS, GET
Content-Type: application/json
Vary: Accept

[
    {
        "item_code": "61f6ccca-e822-4b36-9ddf-5ec79a55a184",
        "name": "Golden Nutella Filled Cookie",
        "price": 100,
        "description": "Delicious Nutella-filled homemade cookie which will satisfy your cravings.",
        "image": "https://images.unsplash.com/photo-1499636136210-6f4ee915583e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=700&q=80",
        "quantity": 12
    },
    {
        "item_code": "ef6f68c4-c9a3-4a4e-8d5a-14d8f75a01ba",
        "name": "Fudgy Dark Brownie",
        "price": 60,
        "description": "Fudgy and chewy dark chocolate passion.",
        "image": "https://bakerbynature.com/wp-content/uploads/2020/04/Cocoa-Fudge-Brownies-1-of-1.jpg",
        "quantity": 16
    }
]

预期反应

[
    {
        "item_code": "61f6ccca-e822-4b36-9ddf-5ec79a55a184",
        "name": "Golden Nutella Filled Cookie",
        "price": 100,
        "description": "Delicious Nutella-filled homemade cookie which will satisfy your cravings.",
        "image": "https://images.unsplash.com/photo-1499636136210-6f4ee915583e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=700&q=80",
        "quantity": 12
    },
]

模型:库存

import uuid
from django.db import models


class Inventory(models.Model):
    item_code = models.UUIDField(
        primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=50, null=False)
    price = models.IntegerField(null=False)
    description = models.CharField(max_length=500)
    image = models.URLField()
    quantity = models.PositiveIntegerField(default=0, null=False)

    def __str__(self):
        return f'Item: {self.name} - Price:{self.price}'

views.py

@api_view(['GET', 'POST'])
def inventory_list(request):

    if request.method == 'GET':
        inventory = Inventory.objects.all()
        serializer = InventorySerializer(inventory, many=True)
        return Response(serializer.data)

    elif request.method == 'POST':
        serializer = InventorySerializer(data=request.data)

        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=HTTP_400_BAD_REQUEST)

为 %NAME% 编辑(使用 name__icontains=name)

@api_view(['GET', 'PUT', 'DELETE'])
def inventory_item(request, name):
    try:
        item = Inventory.objects.get(name__icontains=name)
    except Inventory.DoesNotExist:
        return Response(status=status.HTTP_404_NOT_FOUND)

    if request.method == 'GET':
        serializer = InventorySerializer(item)
        return Response(serializer.data)

    elif request.method == 'PUT':
        serializer = InventorySerializer(item, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    elif request.method == 'DELETE':
        item.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

serializers.py

class InventorySerializer(serializers.ModelSerializer):
    class Meta:
        model = Inventory
        fields = ['item_code', 'name', 'price',
                  'description', 'image', 'quantity']

应用名称:api urls.py

urlpatterns = [
    path('', inventory_list),
    path('<str:name>/', inventory_item)
]

urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('inventory/', include('api.urls'))
]

【问题讨论】:

标签: django django-rest-framework


【解决方案1】:

这是检索项目的视图。查看Eric Andrews 的回答,了解如何获取 GET 数据。

@api_view(['GET', 'PUT', 'DELETE'])
def inventory_item(request):

    if request.method == 'GET':
        name = request.GET.get('name')
        try:
            items = Inventory.objects.filter(name__icontains=name)
            serializer = InventorySerializer(items, many=True)
            return Response(serializer.data, status=status.HTTP_200_OK)
        except Inventory.DoesNotExist:
            return Response(status=status.HTTP_404_NOT_FOUND)

基于类的视图示例:

class GetItemFromInventoryView(ListAPIView):
    serializer_class = InventorySerializer
    
    def get_queryset(self):
        name = self.request.query_params.get('name')
        queryset = Inventory.objects.filter(name__icontains=name)
        return queryset

输出:

【讨论】:

  • 我不知道您是如何根据名称更新或删除数据的,因为它会返回多个查询。由于您使用的是%NAME%,它将成为字符串的一部分,它将返回多个项目。小心点。
  • 非常感谢您的回答。我不是根据名称删除,只是根据名称检索项目。
  • 那么上面应该满足你的需要:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-09
  • 2020-10-28
  • 2016-12-06
  • 2018-05-03
  • 2015-11-19
相关资源
最近更新 更多