我用这种方式宣布了我的两个模型:
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类之后...如何解决此问题?
答案 0 :(得分:4)
此处存在严重的逻辑缺陷 - 从ForeignKey
到Customer
的{{1}}意味着每个客户只有一封电子邮件。你可能想要完全跳过那个外键:
Email
然后只需class Email(models.Model):
customer = models.ForeignKey(Customer, related_name='email_addresses')
即可获得所有电子邮件的列表。你不需要另一个customer.email_addresses
,django使用在一个模型中定义的关系(与RoR和其他MVC框架不同)
答案 1 :(得分:2)
只需在Customer周围添加单引号:
class EmailAddress(models.Model):
customer = models.ForeignKey('Customer')
email_address = models.CharField(max_length=200)
def __unicode__(self):
return self.email_address
答案 2 :(得分:2)
我不明白你为什么要在EmailAddress中使用ForeignKey 使用Django从 Python Web开发中提取:
外键通常用于 定义一对多(或多对一) 关系。 在下一个示例中,一本书有一个作者,一个作者可以有很多书。
class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.ForeignKey(Author)
答案 3 :(得分: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。只是想提一下,以防它可以为你的应用程序增加价值。