django - Django过滤多对多
问题描述
如果我的产品只能在某些地区销售。一个客户也可以属于多个区域。例子:
class Customer(models.Model):
firstname = models.CharField(max_length=100, default="")
class Product(models.Model):
productname = models.CharField(max_length=100, default="")
class Region(models.Model):
regionname = models.CharField(max_length=100, default="")
class CustomerRegionLink(models.Model):
customer = models.ForeignKey(Customer)
region = models.ForeignKey(Region)
class ProductRegionLink(models.Model):
product = models.ForeignKey(Product)
region = models.ForeignKey(Region)
如果我现在有一个 Customer 对象。如何筛选出可以订购的产品?
我尝试过以下版本:
thecustomer = Customer.objects.get(id=1)
prods = ProductRegionLink.object.filter(region__in=thecustomer.customerregionlink.all())
此错误如:ValueError:无法将 QuerySet 用于“CustomerRegionLink”:将 QuerySet 用于“Region”。
解决方案
尝试
thecustomer = Customer.objects.get(id=1)
prods = ProductRegionLink.object.filter(region__in=[cr_link.region for cr_link in thecustomer.customerregionlink.all()])
与您当前的查询一样,您试图在 customerregionlink 查询集中而不是在区域查询集或列表中查找区域。
推荐阅读
- c++ - 当 0 是可接受的值时使用 map::find
- python - 根据优先级对数据帧进行采样
- javascript - 递增整数序列
- android - Android NotePad App - 当我创建一个新笔记并保存它时,我所做的下一个更改不会保存,直到我关闭笔记并再次打开它
- c++ - C++ 使用 Struct 进行员工记录/总工资计算器
- r - 根据 R 中的条件更改列中的值
- javascript - Javascript在20秒后按下键盘键
- r - MatchIt 与多个单元
- jquery - 如何跳出Jquery进行迭代
- vb.net - 如何在 Visual Studio (VB) 中仅将 Word 段落的一部分加粗