Django的OneToOne领域自我 [英] Django OneToOne field to self

查看:70
本文介绍了Django的OneToOne领域自我的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何为相同的 Model 定义 OneToOne 关系?



我有一个名为 Order 的模型,该模型可以与另一个 Order

配对code>。现在,我试图弄清楚如何处理这种关系的模型。



我的想法:

  class Order(models.Model): 
paired_order = models.OneToOneField(self)

OR:

  class Pairing(models.Model):
order1 =模型.ForeignKey(Order,related_name ='pairing')
order2 =模型.ForeignKey(Order,related_name ='pairing')

您怎么看?哪个更有效?



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

  order.paired_order 

或:

  order.pairing.paired 

我希望这种关系是对称的,因此对于每对订单,我称相同的东西并获得配对订单。



配对模型将是一个很好的解决方案,因为我可以向此关系添加其他信息,但是存在一个问题,我必须检测到它是哪个顺序,所以无法调用 order.pairing.order1 ,因为我不知道我是否在调用同一订单。



编辑:

 >>来自_app导入模型
>> order1 = models.Order(flight_number = xxx)
>>> order2 = models.Order(flight_number = yyy,paired_order = order1)
>> order1.paired_order.flight_number

返回没有对象没有....



问题是,当我将order1设置为order2的配对订单时,我想要相反方向的同一件事。因此, order1.paired_order = order2 也会执行 order2.paired_order = order1

解决方案


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


在这种情况下,您可以对那组订单(您称其为配对)进行建模,并添加快捷方式来检索配对的订单。 / p>

  class OrderPair(models.Model):
通过
#附加信息在这里


类Order(models.Model):
对= models.ForeignKey(to = OrderPair,related_name = orders)
#您必须添加自定义验证
#以确保只有2个订单可以属于同一个 OrderPair。

@property
def paired_order(self):
返回self.pair.orders .exclude(id = self.id).first()






一旦你有为此,您可能还希望缓存配对的订单,以避免查询过多。在那种情况下,您不需要相关的名称,因此可以使用 + (在Django中是不太明显的东西)。

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

@属性
def paired_order(self):
如果self.cached_pa​​ired_order:
...
else:
...


How to define OneToOne relationship to the same Model?

I have a model called Order which can be paired with another one Order. Now I'm trying to figure out how to handle models for this relationship.

My ideas:

class Order(models.Model):
    paired_order = models.OneToOneField(self)

OR:

class Pairing(models.Model):
    order1 = models.ForeignKey(Order, related_name='pairing')
    order2 = models.ForeignKey(Order, related_name='pairing')

What do you think? Which is more efficient?

I want to have simple calling of paired ones. So I would do something like:

order.paired_order 

OR:

order.pairing.paired

I want this relation symmetrical so for each pair of orders I call the same thing and get paired order.

Pairing model would be a good solution because I can add additional information to this relationship, but there is a problem that I would have to detect which order is it, so I couldn't call order.pairing.order1 because I don't know whether I'm not calling the same order.

EDIT:

>>> from _app import models
>>> order1 = models.Order(flight_number="xxx")
>>> order2 = models.Order(flight_number="yyy", paired_order=order1)
>>> order1.paired_order.flight_number

RETURNS None object has not ....

The problem is that when I set order1 is a paired order for order2, I want the same thing in opposite direction. So order1.paired_order = order2 do this as well order2.paired_order = order1.

解决方案

Pairing model would be a good solution because I can add additional information to this relationship.

In that case, you could model that group of "orders" (you've called it Pairing) and add a shortcut to retrieve the paired order.

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()


Once you've got this working, you might also want to cache the paired order to avoid too many queries. In that case, you don't want a related name so you can use + (the less explicit thing in Django ever).

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

@property
def paired_order(self):
     if self.cached_paired_order:
          ...
     else:
          ...

这篇关于Django的OneToOne领域自我的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆