在Django中选择不同的嵌套关系

时间:2011-08-17 13:09:01

标签: django orm

为了快速描述系统,我有一个订单列表。每个订单可以包含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)

2 个答案:

答案 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)

假设您有反向键,如:

  • ItemSize.items - 对具有此尺寸的所有项目反转fk
  • Item.orderitems - 与项目
  • 相关的所有订单项的反向
  • Item.orders - 你可以猜测;)

(AFAIR默认选择名称,但我不确定,你必须测试它)

documentation中提供了有关反向键查询的更多信息。