我正在使用简化为的数据模型构建多租户应用程序:

class Tenant(models.Model):
    name = models.CharField(max_length=50)

class Widget(models.Model):
    owner = models.ForeignKey(Tenant)
    sequence_id = ... # question here


我希望Widget.sequence_idAutoField一样工作(即自动给我一些独特的东西,通常以1递增),但范围仅限于一个Widget.owner。因此,例如,当租户A创建3个小部件时,它们将得到sequence_id s 1、2和3。然后,租户B随之出现并创建2个小部件。这些小部件的编号分别为sequence_id s 1和2。租户/用户无法控制该编号,但这是她将在UI中看到的。 AutoNumber之所以消失,是因为从单个租户的角度来看,他们应该具有顺序的窗口小部件ID。 GUID / UUID不再可用,因为它们必须是人类可读的。

我浏览了AutoFieldunique_together上的文档。我找到了this,这不是我想要的。尽管我可能会错过它,但在djangopackages.com上我看不到任何能解决我问题的东西。我在Django用户邮件列表中询问并得到了一些小问题,但希望在此处进行更广泛的了解。

是否有一个通用的模式?

最佳答案

此刻,我已经实现了它:

class Widget(models.Model):
    owner = models.ForeignKey(Tenant)
    sequence_id = models.PositiveIntegerField(default=None, editable=False)

    def save(self, *args, **kwargs):
        if sequence_id is None:
            # this is a new one, so it needs a new sequence number
            with transaction.atomic():
                last_num = Widget.objects.filter(
                    owner=self.owner).aggregate(
                    Max('sequence_id'))
                self.sequence_id = (last_num['sequence_id__max'] or 0) + 1
                super(Widget, self).save(*args, **kwargs)
        else:
            # just making changes to an existing one
            super(Widget, self).save(*args, **kwargs)

09-30 15:47