【问题标题】:How get products from product table based on the category search in django restframework, How do inner join in django restframework如何根据django rest框架中的类别搜索从产品表中获取产品,django rest框架中如何进行inner join
【发布时间】:2020-06-01 08:38:02
【问题描述】:

我是 django restframework 的新手,我尝试创建一个搜索 api。

我设计了 2 个模型

class Category(models.Model):
    name = models.CharField(max_length=200)

    def __str__(self):
        return self.name

class Product(models.Model):
    product_name = models.CharField(max_length=255)
    product_Comments = models.CharField(max_length=255)
    size = models.CharField(max_length=10, null=True)
    product_Status = models.BooleanField(default=True)
    category = models.ForeignKey(Category,  on_delete=models.CASCADE, null=True)

    def __str__(self):
        return self.product_Description

我想创建一个休息 API,我可以在其中搜索类别并根据搜索列出与该类别相关的产品。我该怎么做。

我的观点.py

class productList(generics.ListAPIView):
   serializer_class = productSerializer
   def get_queryset(self):
       queryset = Product.objects.all()
       search = self.request.query_params.get('search', None)
       if search is not None:
           queryset = queryset.filter(product_name__icontains=search)

我的网址

path('product_search/',views.productList.as_view()),

【问题讨论】:

标签: python django join django-models django-rest-framework


【解决方案1】:

你快到了,你只需要添加filtering

此外,您几乎不需要覆盖通用视图的get() 方法。寻找让你做最少工作的方法。对于任何视图,您将在get_queryset 和视图特定方法中完成大部分工作:

  • 列表:查看.list()
  • 创建:view.create()
  • 检索:view.retrieve()
  • 更新:查看.perform_update()
  • 销毁:查看.perform_destroy()

其余的可以通过设置正确的类属性来定制。在极少数情况下需要覆盖视图的“get”或“post”方法。

所以,get_queryset 是修改您要处理的对象集合的地方。这非常适合过滤和搜索。 DRF 中已经有很多工作可用,您可以使用它:

class productList(generics.ListAPIView):
    serializer_class = productSerializer
    def get_queryset(self):
        queryset = Product.objects.all()
        search = self.request.query_params.get('search', None)
        if search is not None:
            queryset = queryset.filter(category__name__icontains=search)
        # don't forget to return the queryset
        return queryset

【讨论】:

  • 谢谢,但它没有点击 url。我的预期网址是“product_search/?search=phone”。这里电话是一个类别,很少有产品在类别电话下的产品表中。我将类别表设置为外键
  • 你能在问题中包含你的 urls.py 吗?
  • 我已经更新了这个问题。我也不想要基于产品名称搜索的搜索列表。我需要类别名称。当用户输入搜索关键字时,它应该过滤类别列表,并根据该类别列表获取产品列表
  • 所以如果你在地址栏中输入localhost:8000/product_search/?search=phone,那么你会得到一个404?那么你可能错过了piece of the url。如果您在设置中将 DEBUG 设置为 True,404 应该会向您解释。
  • 好的,我会检查但我收到字段错误无法识别“类别”
【解决方案2】:

用于根据类别名称过滤产品,

Product.object.filter( category__name = 'category_name')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    相关资源
    最近更新 更多