Django中的ForeignKey字段问题

时间:2009-12-29 14:27:15

标签: django django-models

我用这种方式宣布了我的两个模型:

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类之后...如何解决此问题?

4 个答案:

答案 0 :(得分:4)

此处存在严重的逻辑缺陷 - 从ForeignKeyCustomer的{​​{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。只是想提一下,以防它可以为你的应用程序增加价值。