我正在使用简化为的数据模型构建多租户应用程序:
class Tenant(models.Model):
name = models.CharField(max_length=50)
class Widget(models.Model):
owner = models.ForeignKey(Tenant)
sequence_id = ... # question here
我希望
Widget.sequence_id
像AutoField
一样工作(即自动给我一些独特的东西,通常以1递增),但范围仅限于一个Widget.owner
。因此,例如,当租户A创建3个小部件时,它们将得到sequence_id
s 1、2和3。然后,租户B随之出现并创建2个小部件。这些小部件的编号分别为sequence_id
s 1和2。租户/用户无法控制该编号,但这是她将在UI中看到的。 AutoNumber
之所以消失,是因为从单个租户的角度来看,他们应该具有顺序的窗口小部件ID。 GUID / UUID不再可用,因为它们必须是人类可读的。我浏览了
AutoField
和unique_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)