Django一对多关系

7
我正在使用Django实现一个小型电子商店应用程序。 我的问题涉及使用多个OrderLines来建模订单: 如何将Order与OrderLines的关系建模,使得可以直接从Order访问OrderLines,即:
Order
    def addOrderLine
    def allOrderLines

我希望能够从订单中访问“订单行”,而不必直接从数据库中获取。 Django提供了定义ForeignKeys的可能性,但这并不能解决我的问题,因为我需要定义以下内容:

class OrderLine(models.Model):
   order = models.ForeignKey(Order)

根据这个定义,我必须直接从数据库中获取OrderLines而不是通过Order获取。

我可能会使用这个定义并在Order级别提供方法。然而,这不起作用,因为如果我在models.py文件中定义Order在OrderLine之上,Order就看不到OrderLines了。

2个回答

8
您希望从OrderLine创建到OrderForeignKey。代码如下:
from django.db import models

class Order(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)

class OrderLine(models.Model):
    order = models.ForeignKey(Order, related_name='orderlines')
    name = models.CharField(max_length=30)

    def __unicode__(self):
        return self.name

# Create a new order in the DB:
>>> order = Order.objects.create()
# Add a few items to this order:
>>> order.orderlines.create(name='Candied Yams')
<Candied Yams>
>>> order.orderlines.create(name='Minty loin of Lamb')
<Minty loin of Lamb>
# Get all items for this order:
>>> order.orderitems.all()
[<Candied Yams>, <Minty loin of Lamb>]

这是相当好文档化的行为 :)


6

如果我理解正确,您正在寻找与多对一相反的操作,即提供一个访问器,为您提供每个订单的所有orderlines集合。

幸运的是,创建多对一链接的操作已经为您完成了这个任务。请尝试以下操作:

 o = Order.objects.get(id=X)
 lines = o.orderline_set.all()

现在,lines应该包含整个链接订单行的集合。这似乎没有广泛记录,但是如果您仔细阅读多对一文档中的示例代码,就会经常看到使用此功能。

注意事项:

  • 小写的orderline是故意的,它始终是小写。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接