在我的 Django 项目中,我需要避免用户创建值为 3(3、13、203...)的 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
答案1 只要您跟踪它们,不同的用户 ID 和用户配置文件 ID 就不重要。事实上,我有点喜欢在后端使用不同的用户 ID 的想法,它只代表一个数字,而不是用户创建的用户 ID。我在我的网站上这样做是为了使用 cookie 来保护我的用户的隐私。我只用他们的号码来指代他们,而不是他们给我的名字。
答案2 我看不到数据库会出现任何问题,但请记住,Django 的部分优势是我们可以使用模型生成 SQL 数据库。我们可能需要在生产中编辑数据库以增加功能或范围,但在开发中,我建议在尝试使用它之前确保 Django 正确生成 SQL 表。因此,也许请确保在调用
migrate
时,您的 SQL 数据库是从新数据库正确生成的。
答案3 严格来说,使用 CPython 编译的 Python 程序,有效地作为 C 机器代码运行,不会在处理器上出现死锁。从根本上说,这些问题可以通过使用流水线和并行性在较低级别上得到解决。
您可以让两个用户同时提交相同的用户 ID,其中一个将首先创建,另一个将出现错误。在 try/ except 块中处理该错误,并使用
HTTPResponseRedirect
将用户引导回告诉他们使用不同的用户 ID 重试的页面。