【问题标题】:Is including the user field in two related models a bad practice? (Django)在两个相关模型中包含用户字段是一种不好的做法吗? (姜戈)
【发布时间】:2021-04-28 03:23:48
【问题描述】:

我对 Django 和一般编程还很陌生。

我正在为建筑行业的朋友构建一个工具。基本上,客户投标投标,如果他们中标,他们就会签订合同。一个合同可以有多个项目,一个项目可以有多个工作。但用户还应该能够为未签订合同的小型项目创建工作。每项工作都必须在一个项目下。

如果用户有合同,我希望用户旅程如下所示: 创建合同 -> 创建项目 -> 创建工作。

我想将合同链接到用户和工作,但我不确定在两个相关模型中包含两次用户字段是否正确。我想知道我的解决方案是否错误,以及是否有更好的解决方案。

谢谢!

class Contract(TimeStampedModel):
    
    owner = models.ForeignKey(
        get_user_model(),
        on_delete=models.CASCADE,
    )
    title = models.CharField(
        max_length=100, blank=False, unique=False)
    starting_date = models.DateTimeField(default=timezone.now, blank=True)


    def __str__(self):
        return self.title


class Project(TimeStampedModel):
    
    owner = models.ForeignKey(
        get_user_model(),
        on_delete=models.RESTRICT,
    )
    name = models.CharField(
        max_length=50, blank=False, unique=False)
    contract = models.ForeignKey(
        Contract,
        on_delete=models.RESTRICT,
        related_name='contract',
    )


    def __str__(self):
        return self.name


class Job(TimeStampedModel):
    
    name = models.CharField(
        max_length=50, blank=False, unique=False)
    starting_date = models.DateTimeField(default=timezone.now, blank=True)
    location = models.PointField(geography=True, default=Point(0.0, 0.0))
    address = models.CharField(max_length=250)
    city = models.CharField(max_length=100)
    state = models.CharField(max_length=100)
    zipcode = models.CharField(max_length=20)
    Project = models.ForeignKey(
        Project,
        on_delete=models.RESTRICT,
    )


    def __str__(self):
        return self.name

【问题讨论】:

  • 注意:默认情况下,django 通过向模型名称添加 S 字母来复数模型名称。所以你不需要系统地明确设置verbose_name_pluralJob变成Jobs等)。

标签: django database django-models database-design


【解决方案1】:

在两个(或更多)相关模型中包含用户字段并没有错。

但是,您应该避免不必要的字段/关系。例如,Job,有一个owner 字段,链接到Project,它本身链接到Contract(也有一个owner 字段)。如果这两个所有者可以不同,那就没什么问题了。

但是,如果这两个所有者始终相同,那么这不是一个好的数据库设计。您应该遍历关系来检索所有者。

【讨论】:

  • 对不起,我忘了说用户也可以创建一个不链接到合同的项目。所以我猜我的解决方案是正确的。谢谢!
  • 那么您的项目模型需要以某种方式与您的用户模型相关联,否则您将无法分辨谁拥有给定项目。
  • 我必须将用户归档从Job 移动到Project,因为正如我所提到的,每个工作都必须在一个项目下。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2013-05-15
  • 1970-01-01
  • 2020-05-19
  • 2011-07-22
  • 2015-10-01
  • 2022-12-11
  • 1970-01-01
  • 2017-05-26
相关资源
最近更新 更多