为了快速描述系统,我有一个订单列表。每个订单可以包含1到n个与之关联的项目。每个Item都有一个ItemSizes列表。鉴于以下模型(已根据此问题的字段缩写),我的目标是为给定的Order对象获取不同的ItemSize对象列表。
class ItemSize(models.Model):
name = models.CharField(max_length=10, choices=SIZE_CHOICES)
class Item(models.Model):
name = models.CharField(max_length=100)
sizes = models.ManyToManyField(ItemSize)
class OrderItem(models.Model):
order = models.ForeignKey(Order)
item = models.ForeignKey(Item)
class Order(models.Model):
some_field = models.CharField(max_length=100, unique=True)
所以...如果我有:
o = Order.objects.get(id=1)
#how do I use the ORM to do this complex query?
#i need o.orderitem_set.items.sizes (pseudo-code)
答案 0 :(得分:3)
在你目前的设置中,@ radious的答案是正确的。但是,OrderItems确实不应该存在。订单应与Items有直接的M2M关系。将创建一个与OrderItems非常相似的中间表来实现这种关系,但是使用M2M可以获得更简单和更合理的关系
class Order(models.Model):
some_field = models.CharField(max_length=100, unique=True)
items = models.ManyToManyField(Items, related_name='orders')
然后您可以执行:Order.items.all()
和Item.orders.all()
。此问题所需的查询将简化为:
ItemSize.objects.filter(item__orders=some_order)
如果您需要有关Order-Item关系的其他数据,您可以保留OrderItem,但可以将其用作直通表,如:
class Order(models.Model):
some_field = models.CharField(max_length=100, unique=True)
items = models.ManyToManyField(Items, related_name='orders', through=OrderItem)
你仍然可以获得更简单的关系。
答案 1 :(得分:0)
ItemSize.objects.filter(items__orderitems__order=some_order)
假设您有反向键,如:
(AFAIR默认选择名称,但我不确定,你必须测试它)
documentation中提供了有关反向键查询的更多信息。