1

我的应用程序具有每个都有单个结算配置文件的客户端。Django:如何定义模型关系以实现以下目标?:

我预想具有所谓的“billing_profile”,这将参照名为“BillingProfile”另一个模型属性的“客户”模型我的应用程序。而不是将“BillingProfile”与一个外键定义回“客户端”(即“client = models.ForeignKey(Client)”),我想这是因为每个客户端只有一个帐单配置文件我可以简单地使用一对一的字段。这似乎是合乎逻辑的,或者看起来倒退了(然后在建立客户端之前,我将不得不创建一个BillingProfile)。有没有一个好的方法来做到这一点,而不是我理解它的范例?

回答

1

我想通了。

OneToOneField()可以通过简单的属性方法查找两种方式。

例子:

型号:

class Client(models.Model): 
    ... stuff ... 


class BillingProfile(models.Model): 
    client = models.OneToOneField('Client') 
    ... stuff ... 

现在我能做的任一:

spam_client.billingprofile # returns related BillingProfile Instance 

spam_billingprofile.client # returns related Client instance 

这意味着我不必实例化BillingProfile,直到我'已经准备好了,但如果客户拥有billingprofile属性而不是其他方式,我仍然可以享受到这些好处。

换句话说:我之前想过的都是倒退,但不能太倒退。

2

如果你确定它是一对一的关系,那就是这样做的。 例如,莫不是有2种账单情况客户端:一个供个人使用,并为他的生意,&ç...

这不是倒退,因为采用一对一,或使用外键不会影响创建顺序(既可以先创建配置文件,也可以先创建客户端,然后将其链接)。

+0

谢谢Ofri。除非A)我使用blank = True(我希望所有客户端拥有BillingProfile)或B)我使用save(commit = False),否则我怎么能创建一个没有billing_profile属性设置的客户端(即,没有创建BillingProfile)在我的新客户端上,然后创建BillingProfile并将其添加到客户端,然后在客户端上再次使用save()。我是否认为这一切都错了? – orokusaki 2009-12-23 06:22:03

+0

这是2种方式来做到这一点。一些更多的想法可以在这里找到:http://stackoverflow.com/questions/1652550/can-django-automatically-create-a-related-one-to-one-model – 2009-12-23 06:38:49