Django OneToOne 字段到 self

Mil*_*ano 6 python django django-models

如何定义OneToOne相同的关系Model

我有一个名为 的模型Order,可以与另一个模型配对Order。现在我正在尝试找出如何处理这种关系的模型。

我的想法:

class Order(models.Model):
    paired_order = models.OneToOneField(self)
Run Code Online (Sandbox Code Playgroud)

或者:

class Pairing(models.Model):
    order1 = models.ForeignKey(Order, related_name='pairing')
    order2 = models.ForeignKey(Order, related_name='pairing')
Run Code Online (Sandbox Code Playgroud)

你怎么认为?哪个更有效率?

我想要简单地调用配对的。所以我会做类似的事情:

order.paired_order 
Run Code Online (Sandbox Code Playgroud)

或者:

order.pairing.paired
Run Code Online (Sandbox Code Playgroud)

我希望这种关系是对称的,因此对于每对订单,我将其称为相同的事物并获得配对订单。

配对模型将是一个很好的解决方案,因为我可以向这种关系添加额外的信息,但是有一个问题是我必须检测它是哪个顺序,所以我无法调用,order.pairing.order1因为我不知道我是否不是调用相同的命令。

编辑:

>>> from _app import models
>>> order1 = models.Order(flight_number="xxx")
>>> order2 = models.Order(flight_number="yyy", paired_order=order1)
>>> order1.paired_order.flight_number
Run Code Online (Sandbox Code Playgroud)

退货None object has not ....

问题是,当我将 order1 设置为 order2 的配对订单时,我想要相反方向的相同内容。所以order1.paired_order = order2也这样做吧order2.paired_order = order1

Fra*_*ant 3

配对模型将是一个很好的解决方案,因为我可以向这种关系添加附加信息。

在这种情况下,您可以对该组“订单”(您将其称为配对)进行建模,并添加一个快捷方式来检索配对订单。

class OrderPair(models.Model):
    pass        
    # additional information goes here


class Order(models.Model):
    pair = models.ForeignKey(to="OrderPair", related_name="orders")
    # you'll have to add custom validation 
    # to make sure that only 2 orders can belong to the same "OrderPair"

    @property
    def paired_order(self):
         return self.pair.orders.exclude(id=self.id).first()
Run Code Online (Sandbox Code Playgroud)

一旦您完成此操作,您可能还需要缓存配对订单以避免太多查询。在这种情况下,您不需要相关的名称,因此您可以使用+(Django 中不太明确的名称)。

class Order(models.Model):
    ...
    cached_paired_order = models.ForeignKey(to='self', related_name='+')

@property
def paired_order(self):
     if self.cached_paired_order:
          ...
     else:
          ...
Run Code Online (Sandbox Code Playgroud)