自定义保存方法的缺点是避免用户获取具有特定值的 userprofile_id 。 (姜戈/赫罗库)

问题描述 投票:0回答:1

在我的 Django 项目中,我需要避免用户创建值为 3(3、13、203...)的 userprofile_id。

这是另一个问题的临时解决方法,可能需要更长时间才能产生结果。

我发布了下面的代码。

但是我的问题更多地涉及到这个临时修复的缺点。

这会产生什么样的问题。这是我列出的清单以及我对每个问题的回答:

  1. User_id 将与 userprofile_id 不同 - 这里看不到任何问题。
  2. 删除自定义方法时对数据库完整性的影响 - 我看不到删除该方法将如何影响数据库。希望我是对的。;
  3. 一些性能问题 - 保存是在数据库级别,我认为这可能会导致一些延迟。这是针对飞行员+的。我预计每天不会有数千个新用户。同时注册的两个用户最终会得到相同的 userprofile_id 吗?是否需要等待来限制潜在的死锁?

对于那些好奇的人来说代码:

class UserProfile(models.Model):
    user = models.OneToOneField(User, null=True, on_delete=models.CASCADE)

    def __str__(self):
        return str(self.user)
    
    def save(self, *args, **kwargs):
        if not self.pk:
            # Logic for generating userprofile_id without '3'
            last_userprofile = UserProfile.objects.all().order_by('-id').first()
            print(f'last_userprofile: {last_userprofile.id}')
            if last_userprofile:
                last_id = last_userprofile.id
                print(f'last_id: {last_id}')
                next_id = last_id + 1
                print(f'next_id: {next_id}')
                while '3' in str(next_id):
                    next_id += 1
                self.id = next_id
            else:
                self.id = 1 
django django-models deadlock database-deadlocks
1个回答
0
投票

答案1 只要您跟踪它们,不同的用户 ID 和用户配置文件 ID 就不重要。事实上,我有点喜欢在后端使用不同的用户 ID 的想法,它只代表一个数字,而不是用户创建的用户 ID。我在我的网站上这样做是为了使用 cookie 来保护我的用户的隐私。我只用他们的号码来指代他们,而不是他们给我的名字。

答案2 我看不到数据库会出现任何问题,但请记住,Django 的部分优势是我们可以使用模型生成 SQL 数据库。我们可能需要在生产中编辑数据库以增加功能或范围,但在开发中,我建议在尝试使用它之前确保 Django 正确生成 SQL 表。因此,也许请确保在调用

migrate
时,您的 SQL 数据库是从新数据库正确生成的。

答案3 严格来说,使用 CPython 编译的 Python 程序,有效地作为 C 机器代码运行,不会在处理器上出现死锁。从根本上说,这些问题可以通过使用流水线和并行性在较低级别上得到解决。

您可以让两个用户同时提交相同的用户 ID,其中一个将首先创建,另一个将出现错误。在 try/ except 块中处理该错误,并使用

HTTPResponseRedirect
将用户引导回告诉他们使用不同的用户 ID 重试的页面。

© www.soinside.com 2019 - 2024. All rights reserved.