gpt4 book ai didi

Django 模型 - 每个父引用的子表元素的自动增量 id

转载 作者:行者123 更新时间:2023-12-02 20:10:01 27 4
gpt4 key购买 nike

我正在尝试在 Django 中构建一个包含公司和项目的应用程序的数据库。每个公司可以有多个项目,每个项目只能属于一个公司。

class Company(models.Model):
name = models.CharField(max_length=20)

class Project(models.Model):
company = models.ForeignKey(Company, on_delete=models.CASCADE)
project_id = models.PositiveIntegerField()
name = models.CharField(max_length=20)

我希望模型项目中有一个字段或属性,其作用类似于公司内项目的自动增量整数。行为应如下所示:

c1 = Company(name="C1")
c2 = Company(name="C2")
px = Project(company=c1, name="X")
py = Project(company=c2, name="Y")
pz = Project(company=c1, name="Z")
px.project_id
1
py.project_id
1
pz.project_id
2

正确的方法是什么?

最佳答案

完成此操作的最自动方法是自定义模型的 save 方法,例如:

class Project(models.Model):
company = models.ForeignKey(Company, on_delete=models.CASCADE)
project_id = models.PositiveIntegerField()
name = models.CharField(max_length=20)

def save(self, *args, **kwargs):
if self.pk == None:
self.project_id = Project.objects \
.filter(company=self.company) \
.aggregate(max_id=Max("project_id")).get("max_id",0) + 1)

super().save(*args, **kwargs) # Call the "real" save() method.

您可以在django docs中阅读有关保存的更多信息。和 in this blog post by Lincoln Loop

话虽如此,正如 @markwalker_ 所指出的,您可能会发现使用辅助“id”管理您的项目有点令人困惑,因为您已经获得了一个对所有项目都是唯一的自然顺序 ID。使用 slug 和 start_date 来识别您的项目可能是值得的,然后您可以结合公司 slug 轻松识别它们、创建自然 URL 等。

例如:

/company/acme-inc/2018/12/website-redesign/

对比

/company/acme-inc/project/4/

关于Django 模型 - 每个父引用的子表元素的自动增量 id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53807409/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com