2009-12-29 68 views
0

我宣布我的两个模型是这样的:ForeignKey的领域的问题在Django

class EmailAddress(models.Model): 
    customer = models.ForeignKey(Customer) 
    email_address = models.CharField(max_length=200) 
    def __unicode__(self): 
    return self.email_address 

class Customer(models.Model): 
. 
. 
. 
email_address = models.ForeignKey(EmailAddress) 
def __unicode__(self): 
    name = ''+str(self.title)+" "+str(self.first_name)+" "+str(self.last_name) 
    return name 

的想法是,一个客户可以关联到他几个电子邮件地址/她......问题是怎么做的这个正确的......你可以从上面我的代码看,客户的外键字段必须是客户下课,但电子邮件地址外键字段是EmailAddress的下课后...我怎么理清这个问题?

+3

不相关的问题,但有一个与你的unicode的方法一个严重的错误 - 它不返回Unicode。如果您的任何客户的标题或名称中包含非ASCII字符,则Python会崩溃。做到这一点,而不是:'名称= U '%s%S%S' %(self.title,self.first_name,self.last_name)' – 2009-12-29 15:41:58

+0

感谢你的小费丹尼尔 – Stephen 2009-12-31 14:01:58

回答

2

我不明白你为什么要使用EmailAddress的一个ForeignKey。
摘自的Python Web开发Django的

外键通常用来 定义一个一对多(或多对一之一) 关系。 在下一个例子中,一本书有一个作者,一个作者可以有很多书。

class Author(models.Model): 
    name = models.CharField(max_length=100) 

class Book(models.Model): 
    title = models.CharField(max_length=100) 
    author = models.ForeignKey(Author) 
2

只需添加单引号的客户:

class EmailAddress(models.Model): 
    customer = models.ForeignKey('Customer') 
    email_address = models.CharField(max_length=200) 
    def __unicode__(self): 
    return self.email_address 
4

这里有一个严重的逻辑漏洞 - ForeignKeyCustomerEmail意味着每个客户只有一个电子邮件。你会希望产品总数跳过外键:

class Email(models.Model): 
    customer = models.ForeignKey(Customer, related_name='email_addresses') 

后来干脆customer.email_addresses让所有电子邮件的列表。您不需要另一ForeignKey,Django使用一个模型中定义的关系(不像回报率和其他MVC框架)

0

MENDA的答案是正确的。没有真正的订购问题,因为Customer模型不需要ForeignKey字段。只要删除它并翻转定义类的顺序即可。

class Customer(models.Model): 
    pass 

class EmailAddress(models.Model): 
    customer = models.ForeignKey(Customer) 
    email_address = models.CharField(max_length=200) 

还有一个您可以使用的Django电子邮件字段。见Django EmailField。只是想提一下,以防它可以为您的应用程序增加价值。