【问题标题】:one-to-one and one-to-many modeling一对一和一对多建模
【发布时间】:2012-02-11 01:26:48
【问题描述】:

人员和地址也是如此。一个人可能有多个地址,但每个人只能将一个地址标记为主要地址。以下是我考虑过的两种方法。

第一个在保存时很尴尬,因为我必须先保存人,然后是变体,然后再用变体 pk 保存人。

对于第二种方法,防止一个人拥有多个主要地址的唯一方法似乎是在代码中添加验证。

# First approach
class Person(models.Model):
    primary_address = models.ForeignKey('Address')
    ...


class Address(models.Model):
    person = models.ForeignKey(Person)
    ...

# Second approach
class Person(models.Model):
    ...

class Address(models.Model):
    person = models.ForeignKey(Person)
    is_primary = models.BooleanField()
    ...

【问题讨论】:

  • 只是为了使事情复杂化,一个地址是否可能是一个人的主要地址而不是另一个人的主要地址?如果是这样,变体 2 将不起作用。
  • 不确定我是否理解您的问题。地址不会在人与人之间共享。
  • 好的,但是很可能想象一个地址可以共享的情况。例如。兄弟姐妹上同一所学校。这就是我提出它的原因。
  • 是的,这是要考虑的事情。

标签: django one-to-many modeling one-to-one


【解决方案1】:

对于这种情况,我通常选择选项 #2。查询稍微困难一些,因为有时您必须执行额外的查询 + 过滤器才能选择它,但正如您所提到的,它还为您提供了更干净地保存它的选项。

使用选项#2,您可以覆盖地址模型的保存方法,以便它将来自用户的所有其他地址标记为非主要,如果它本身是主要的。

【讨论】:

    猜你喜欢
    • 2019-08-04
    • 2015-07-10
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    相关资源
    最近更新 更多