gpt4 book ai didi

python - 字段行为,例如 AutoField + unique_with

转载 作者:太空宇宙 更新时间:2023-11-03 17:52:50 26 4
gpt4 key购买 nike

我正在构建一个 Multi-Tenancy 应用程序,其数据模型可简化为:

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 1 和 2。租户/用户无法控制该数字,但她会在 UI 中看到该数字。 AutoNumber 已被淘汰,因为从单个租户的角度来看,它们应该具有连续的小部件 ID。 GUID/UUID 已被淘汰,因为它们需要人类可读。

我浏览了有关 AutoFieldunique_together 的文档。我发现this ,这不完全是我想要的。我在 djangopackages.com 上没有看到任何可以解决我的问题的内容,尽管我可能错过了它。我在 Django 用户邮件列表上询问并得到了一些答案,但希望在这里更广泛地了解 SO。

这有通用的模式吗?

最佳答案

目前,我是这样实现的:

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)

关于python - 字段行为,例如 AutoField + unique_with,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28892065/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com