首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字段行为,如AutoField + unique_with

字段行为,如AutoField + unique_with
EN

Stack Overflow用户
提问于 2015-03-06 11:52:14
回答 1查看 36关注 0票数 1

我正在构建一个具有数据模型的多租户应用程序,它可以简化为:

代码语言:javascript
复制
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_ids 1、2和3。然后租户B出现并创建2个小部件;这些小部件获得sequence_ids 1和2。租户/用户无法控制数量,但可以在UI中看到。AutoNumber之所以被淘汰,是因为从单个租户的角度来看,它们应该具有连续的小部件ID。GUID/UUID的出现是因为它们需要是人类可读的。

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

这有没有一个通用的模式?

EN

回答 1

Stack Overflow用户

发布于 2015-03-06 11:58:09

目前,我像这样实现了它:

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28892065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档