【问题标题】:ForeignKey field problem in DjangoDjango中的ForeignKey字段问题
【发布时间】:2009-12-29 14:27:15
【问题描述】:

我以这种方式声明了我的两个模型:

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 类之后...我该如何解决这个问题?

【问题讨论】:

  • 与您的问题无关,但您的 unicode 方法存在严重错误 - 它不返回 unicode。如果您的任何客户的标题或名称中有非 ASCII 字符,Python 将严重崩溃。改为这样做:name = u'%s %s %s' % (self.title, self.first_name, self.last_name)

标签: django django-models


【解决方案1】:

这里有一个严重的逻辑缺陷——ForeignKeyCustomerEmail 意味着每个客户只有一封电子邮件。你会想一起跳过那个外键:

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

然后只需执行customer.email_addresses 即可获取所有电子邮件的列表。你不需要另一个ForeignKey,django 使用一个模型中定义的关系(不像 RoR 和其他 MVC 框架)

【讨论】:

    【解决方案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】:

      只需在客户周围添加单引号:

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

      【讨论】:

        【解决方案4】:

        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。只是想提一下,以防它可以为您的应用程序增加价值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-12-15
          • 2018-03-01
          • 2020-08-02
          • 2014-07-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多