2012-03-30 80 views
3

我有一个Django模型,看起来像这样的工作:我可以创建一个OneToOneField,它将创建一个对象,如果它不存在?

class Subscription(models.Model): 
    user = models.OneToOneField(User) 

也就是说,它具有与Django的auth模块User类一到一对一的关联。这种关联不是可选的;然而,由于一些遗留代码,并与数据库中的一些手工修补,也有其中一个用户做案件具有相关联的订阅,这意味着像这样的代码:

sub = user.subscription 

将抛出一个DoesNotExist异常。但是,大部分代码库假定每个用户都有一个关联的对象。

有没有一种方法,我可以继承OneToOneField这样,如果相关Subscription对象不存在于数据库中,我将创建一个并返回时user.subscription被调用它,而不是抛出异常?

回答

1

正确的做法是获取post_save信号,如有必要可创建对象。

+0

这种情况多发生于传统(现有的)'用户',所以'post_save'信号在引用相关的'subscription'对象之前不一定被触发。 – mipadi 2012-03-30 22:34:02

+1

单个查询可以处理所有旧用户。 – 2012-03-30 22:43:26

0

添加一个名为subscription属性,并以getter创造必要的参考,对于您可能必须做一些猴子补丁,更好的选择是

  1. 重构你的代码,并添加一个效用函数来获取订阅
  2. 重构你的代码,并添加proxy model用户
  3. 刚刚修复DB一次
相关问题