【问题标题】:Filter distinct objects from ManyToMany within ManyToMany从 ManyToMany 中的 ManyToMany 中过滤不同的对象
【发布时间】:2022-01-11 11:06:39
【问题描述】:

我的 Django DRF 应用中有以下模型。

class FilterValue(models.Model):
  code = models.Charfield(…)

class ProductVariant(models.Model):
  filters = models.ManyToManyField("FilterValue", blank=True, …)

class Product(models.Model):
  variants = models.ManyToManyField("ProductVariant", blank=True, …)

  category = models.ForeignKey("Category", blank=True)

我正在尝试在 Category 模型上定义函数,该函数将返回 FilterValue 的所有对象,这些对象附加到该类别中分配的所有 Products 中的所有 ProductVariants。 由于我将拥有大量不同的 ProductVarint,我无法摆脱嵌套循环,因为它真的很慢。

我曾多次尝试解决它。​​

我当然可以使用以下方法在Category 中获取所有Products

products = Product.objects.filter(category=self)

但后来我陷入了这样一个事实,即我实际上需要过滤嵌套的 ManyToMany 对象,因为我需要 QuerySet 中所有产品的所有 ProductVariants,然后 - 在另一个级别中,我需要每个 ProductVariant 的所有 ManyToMany FilterValue 对象。

谢谢。

【问题讨论】:

    标签: django django-models django-rest-framework django-orm


    【解决方案1】:

    这是关于如何查询多对多关系的documentation

    试试这个来解决你的问题:

    filters = FilterValues.objects.filter(productvariant_set__in = ProductVariant.objects.filter(product_set__in = Product.objects.filter(category=your_category)))
    

    【讨论】:

    • 感谢您的快速回复和建议!我不知道_set。但它没有按预期工作。它抛出AttributeError: 'ManyToManyDescriptor' object has no attribute 'filter'。当我尝试关注 ProductVariant.objects.all().first().product_set.all() 时,没关系并返回所有 Product 实例。但一般来说,如果你明白我的意思,它似乎更多地返回 Product 实例而不是 ProductVariant 的 QuerySet。
    • @MichalPůlpán,我改变了答案,你需要在过滤器中嵌套反向查询。
    • 遗憾的是它不允许我过滤productvariant_set,但我可能已经找到了解决方案。不确定它是否有效,但它比我以前的解决方案运行得更快。我是FilterValue.objects.filter(pk__in=some_category.products().values_list('product_variants__filters', flat=True)) 谢谢大家的意见和介绍我_set
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2012-08-19
    • 1970-01-01
    • 2012-04-19
    相关资源
    最近更新 更多