Самый автоматический способ сделать это - настроить 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.
Подробнее о save
можно прочитать в документах django и в этом сообщении от Lincoln Loop
При этом, как отмечает @markwalker_, вы можете посчитать, что управлять своими проектами с помощью вторичного «id» может быть немного странно,учитывая, что вы уже получаете естественный последовательный, который уникален для всех проектов.Возможно, стоит идентифицировать ваши проекты с помощью slug и start_date, а затем вы можете легко идентифицировать их, создавать естественные URL и т. Д. В сочетании с слагом компании.
Например:
/company/acme-inc/2018/12/website-redesign/
против
/company/acme-inc/project/4/