如何解决当ManyToMany Django ORM时从表输出所有值后代
有两个表
catalog_product:
id |name
10 prod3
9 prod2
8 prod1
11 prod5
catalog_productcategory: (mptt model)
id | name | lft | rght | tree_id | level | parent_id
2 root1 1 6 1 0 null
3 subroot1 2 5 1 1 2
5 subsubroot1 3 4 1 2 3
6 root2 1 4 2 0 null
7 subroot2 2 3 2 1 6
Link table catalog_product_category:
id | product_id | productcategory_id
7 10 2
8 9 3
9 8 5
10 11 7
catalog_productcategory树摘要如下:
root1
subroot1
subsubroot1
root2
subroot2
我的两个具有多对多关系的模型
class ProductCategory(MPTTModel):
"""категории продуктов"""
name = models.CharField(max_length=255)
parent = TreeForeignKey('self',on_delete=models.CASCADE,null=True,blank=True,related_name='children')
class MPTTMeta:
order_insertion_by = ['name']
def __str__(self):
return self.name
def get_products(self):
return self.category_products.all()
class Product(models.Model):
"""Продукты"""
name = models.CharField(max_length=1024)
category = models.ManyToManyField(ProductCategory,related_name="category_products")
def __str__(self):
return self.name
访问root1时,我不仅希望接收此根类别中的产品,而且还希望接收子类别中的所有产品,并且访问子类别时,我仅希望接收其中的内容。
def getiing(request):
categories = ProductCategory.objects.prefetch_related('category_products')
stores = []
for cat in categories:
products = [{'product_id': product.id,'product_name': product.name} for product in cat.get_products()]
if not products:
pass
else:
stores.append({'category_id': cat.id,'category_name': cat.name,'products': products})
print(*stores,sep='\n')
我明白了:
{'category_id': 2,'category_name': 'root1','products': [{'product_id': 10,'product_name': 'prod3'}]}
我需要: 通过root1进行简单过滤:
{'category_id': 2,'product_name': 'prod3'},{'product_id': 9,'product_name': 'prod2'},{'product_id': 8,'product_name': 'prod1'}]}
通过subroot1进行简单过滤:
{'category_id': 3,'category_name': 'subroot1','product_name': 'prod2'}]}
类别嵌套级别不受限制
解决方法
我需要什么
Product.objects.filter(category__in=ProductCategory.objects.get(id=5).
get_descendants(include_self=True))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。