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。
配对模型将是一个很好的解决方案,因为我可以向这种关系添加附加信息。
在这种情况下,您可以对该组“订单”(您将其称为配对)进行建模,并添加一个快捷方式来检索配对订单。
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)