【问题标题】:getting all products from parent category django rest从父类别 django rest 获取所有产品
【发布时间】:2019-12-10 21:12:03
【问题描述】:

我有与子类别相关的产品,例如:我有这样的类别

Toys, Toys -> ChildToys, Toys -> ChildToys -> Cars 我有与Toys -> ChildToys -> Cars 相关的产品,我可以通过Cars 获得所有产品,但是如何通过过滤Toys 类别获得产品。到目前为止我做了什么

class Category(models.Model):
    name = models.CharField(max_length=100)
    slug = models.SlugField(max_length=100, blank=True, unique=True)
    icon = models.ImageField(upload_to='category_icons', null=True, blank=True)
    parent = models.ForeignKey('self', on_delete=models.SET_NULL, related_name='children', null=True, blank=True)


class Product(models.Model):
    category = models.ForeignKey(Category, blank=True, null=True, on_delete=models.CASCADE)
    name = models.CharField(max_length=200)

class ProductList(generics.ListAPIView):
    serializer_class = ProductSerializer

  def get_queryset(self):
    slug = self.request.query_params.get('slug', None)
    parent_id = Category.objects.get(slug=slug)
    cats = Category.objects.filter(parent_id=parent_id)

    qs = Product.objects.filter(category_id__in=parent_id)

    print(qs)
    return qs

【问题讨论】:

  • 您能分享一下您的CategoryProduct 模型的相关部分吗?
  • 请稍等
  • @WillemVanOnsem 你能看看吗?

标签: python django django-rest-framework django-views


【解决方案1】:

如果您需要遍历整个子树,您需要在 Category 模型上创建一个递归获取所有子类别的方法。 another post 向您展示了如何做到这一点。

所以假设你有那个方法Category.get_family_tree()

class Category(models.Model):
    # fields    
    def get_family_tree(self):
        # code from question linked above
        # returns list of `Category` instances

那么在您看来,您可以像这样获取产品:

def get_queryset(self):
    slug = self.request.query_params.get('slug')
    categories = Category.objects.get(slug=slug).get_family_tree()
    return Product.objects.filter(category__parent__in=categories)

【讨论】:

  • 我在我的Category 模型中添加了get_family_tree,但get_family_tree 没有定义。我应该把这个方法放在哪里?
  • 作为Category 类的方法。 “我在Category 模型中添加了get_family_tree”是什么意思?我想这意味着你已经完成了def get_family_tree(self): ...
  • 是的,我也这样做了,我输入了children': [self.get_family_tree(child) for child in children],但我有一个名为TypeError get_family_tree() takes 1 positional argument but 2 were given的新错误
  • 应该是child.get_family_tree()。想想吧。
  • 不要忘记将self 添加到您返回的数组中,因为您还希望包含原始类别,而不仅仅是孩子(和孙子,...)
【解决方案2】:

您可以使用以下方式过滤:

class ProductList(generics.ListAPIView):
    serializer_class = ProductSerializer

    def get_queryset(self):
        slug = self.request.query_params.get('slug')
        return Product.objects.filter(category__parent__slug=slug)

或者对于区分大小写的匹配:

class ProductList(generics.ListAPIView):
    serializer_class = ProductSerializer

    def get_queryset(self):
        slug = self.request.query_params.get('slug')
        return Product.objects.filter(category__parent__slug__iexact=slug)

【讨论】:

  • 感谢 Willem 的回答,但它返回了我使用此 url product/?slug=toys 请求的空值,但它不起作用
  • @Nerd:但类别是Toys,而不是toys
  • @Nerd:使用__iexact 查找不区分大小写的匹配。
  • 这两种情况都返回空查询集,请帮助我
  • @Nerd:你确定没有间距问题吗?如果您手动尝试使用Category.objects.filter(slug='Toys') 检索Category 会怎样?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多