字段行为,如AutoField + unique_with

时间:2015-03-06 03:52:14

标签: 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_idAutoField一样工作(也就是说,自动给我一些独特的东西,通常递增1),但是限定为一个Widget.owner。因此,例如,当租户A创建3个小部件时,他们将获得sequence_id的1,2和3.然后租户B出现并创建2个小部件;这些小部件得到sequence_id s 1和2.租户/用户无法控制数字,但它是在UI中看到的内容。 AutoNumber已经出局了,因为从单个租户的角度来看,他们应该有顺序的小部件ID。 GUID / UUID已经出局,因为它们必须是人类可读的。

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

这有共同的模式吗?

1 个答案:

答案 0 :(得分:1)

目前,我已经像这样实施了它:

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)