[英]Foreign Key Django Model
我正在尝试创建 3 个模型; Person
、 Address
和Anniversy
。 计划是为每个人设置一个地址和一个纪念日。 但是每个地址和纪念日可以有多个人。
到目前为止,我有以下内容,但我认为OneToMany(foreign key)
关系可能是错误的。 即每个地址可以有一个人,但每个人可以有多个地址。
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=50)
birthday = models.DateField()
def __unicode__(self):
return u'%s' % (self.name)
class Address(models.Model):
person = models.ForeignKey(Person)
address = models.CharField(max_length=150)
def __unicode__(self):
return u'%s' % (self.address)
class Anniversy(models.Model):
person = models.ForeignKey(Person)
anniversy = models.DateField()
def __unicode__(self):
return u'%s' % (self.anniversy)
您以相反的方式创建关系; 将外键添加到Person
类型以创建多对一关系:
class Person(models.Model):
name = models.CharField(max_length=50)
birthday = models.DateField()
anniversary = models.ForeignKey(
"Anniversary", on_delete=models.CASCADE)
address = models.ForeignKey(
"Address", on_delete=models.CASCADE)
class Address(models.Model):
line1 = models.CharField(max_length=150)
line2 = models.CharField(max_length=150)
postalcode = models.CharField(max_length=10)
city = models.CharField(max_length=150)
country = models.CharField(max_length=150)
class Anniversary(models.Model):
date = models.DateField()
我为其他模型使用了字符串名称,因此它们仍然可以在之后定义,或者您可以最后定义Person
模型。
任何一个人只能连接到一个地址和一个周年纪念日,但地址和周年纪念日可以从多个Person
条目中引用。
Anniversary
和Address
对象也将被赋予反向、反向的关系; 默认情况下,它将被称为person_set
,但如果需要,您可以配置不同的名称。 请参阅查询文档中的“向后”关系。
我建议,如果使用基于应用程序的方法来分离逻辑关注点,使用字符串模型引用来处理ForeignKey
关系会稍微好一些。
因此,扩展 Martijn Pieters 的答案:
class Person(models.Model):
name = models.CharField(max_length=50)
birthday = models.DateField()
anniversary = models.ForeignKey(
'app_label.Anniversary', on_delete=models.CASCADE)
address = models.ForeignKey(
'app_label.Address', on_delete=models.CASCADE)
class Address(models.Model):
line1 = models.CharField(max_length=150)
line2 = models.CharField(max_length=150)
postalcode = models.CharField(max_length=10)
city = models.CharField(max_length=150)
country = models.CharField(max_length=150)
class Anniversary(models.Model):
date = models.DateField()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.