Python 字段行为,如AutoField+;独特的

Python 字段行为,如AutoField+;独特的,python,django,django-models,Python,Django,Django Models,我正在构建一个多租户应用程序,其数据模型简化为: class Tenant(models.Model): name = models.CharField(max_length=50) class Widget(models.Model): owner = models.ForeignKey(Tenant) sequence_id = ... # question here 我希望Widget.sequence\u id像AutoField一样工作(也就是说,自动给我一

我正在构建一个多租户应用程序,其数据模型简化为:

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

class Widget(models.Model):
    owner = models.ForeignKey(Tenant)
    sequence_id = ... # question here
我希望
Widget.sequence\u id
AutoField
一样工作(也就是说,自动给我一些唯一的、通常递增1的内容),但范围限于单个
Widget.owner
。例如,当租户A创建3个小部件时,他们将获得
sequence\u id
s1、2和3。然后租户B出现并创建2个小部件;这些小部件获得
sequence\u id
s1和s2。租户/用户无法控制数字,但这是她将在UI中看到的<代码>自动编号已退出,因为从单个租户的角度来看,它们应该具有连续的小部件ID。guid/uuid已经过时,因为它们需要可读性

我查看了
AutoField
unique\u上的文档。我发现,这不是我想要的。我在djangoppackages.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)