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

时间:2018-12-16 23:31:12

标签: django model auto-increment

我正在尝试在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)

我想在Project模型中有一个字段或属性,该字段或属性的作用类似于公司内项目的自动递增整数。该行为应类似于以下内容:

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

正确的方法是什么?

2 个答案:

答案 0 :(得分:1)

最自动的方法是自定义模型的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 docsin this blog post by Lincoln Loop

中阅读有关save的更多信息。

话虽如此,如@markwalker_所述,您可能会发现使用辅助的“ id”来管理您的项目有些困惑,因为您已经获得了一个自然的顺序项目,对于所有项目都是唯一的。最好用一个slug和start_date来标识您的项目,然后与一个公司slug一起轻松地标识它们,创建自然的URL等。

例如:

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

vs

/company/acme-inc/project/4/

答案 1 :(得分:0)

您可以使用自动字段进行自动递增:

class Project(models.Model):
    company = models.ForeignKey(Company, on_delete=models.CASCADE)
    project_id = models.AutoField(primary_key=False) # set it as primary key if you want it to be
    name = models.CharField(max_length=20)

我不清楚您要做什么,但似乎您想跟踪每个公司有多少个项目。在这种情况下,您可以为Company编写模型函数,以跟踪有多少:

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

    def get_project_count(self):
        project_count = Project.objects.filter(company=self).count()
        self.projects = project_count
        self.save()
        return self.projects