django - Django:id字段的值即将到来 None
问题描述
我想为我的 django 项目中的所有组创建一个唯一的 ID,这将有助于我们轻松检测用户操作。
我尝试了以下方法:
楷模:
class Group1(models.Model):
urlhash = models.CharField(max_length=6, null=True, blank=True, unique=True)
user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,null=True,blank=True)
group_name = models.CharField(max_length=32)
这是我给出的功能:
def save(self):
if not self.urlhash:
if self.user.profile.user_type == 'Business User':
self.urlhash = 'B' + str(self.user.id) + ('00') + str(self.id)
else:
self.urlhash = 'P' + str(self.user.id) + ('00') + str(self.id)
super(Group1, self).save()
但str(self.id)
即将到来 无。
谁能解释一下为什么会发生这个错误?
谢谢
根据@JPG和@sandip给出的解决方案我终于得到了解决方案
def save(self):
super(Group1, self).save()
if not self.urlhash:
if self.user.profile.user_type == 'Business User':
self.urlhash = 'B' + str(self.user.id) + ('00') + str(self.id)
Group1.objects.filter(pk=self.pk).update(urlhash=self.urlhash)
else:
self.urlhash = 'P' + str(self.user.id) + ('00') + str(self.id)
Group1.objects.filter(pk=self.pk).update(urlhash=self.urlhash)
这对我有用...谢谢大家
解决方案
为什么self.id
是None
?
这是因为 Django 在对象创建之后分配id
/pk
值,也就是在调用save()
model 的方法之后。
因此,调用该save()
方法,然后尝试执行您的逻辑,如下所示
def save(self):
super(Group1, self).save()
if not self.urlhash:
if self.user.profile.user_type == 'Business User':
self.urlhash = 'B' + str(self.User.id) + ('00') + str(self.id)
<b>self.__class__.objects.filter.(pk=self.pk).update(urlhash=urlhash)</b>
else:
self.urlhash = 'P' + str(self.User.id) + ('00') + str(self.id)
<b>self.__class__.objects.filter.(pk=self.pk).update(urlhash=urlhash)
更新
我得到一点,在调用该save()
方法后应该再次更新实例。所以我使用了这个语句
self.__class__.objects.filter.(pk=self.pk).update(urlhash=urlhash)
感谢@sanip从他的回答中得到的想法
推荐阅读
- python - 如何编写 Python 来获取所有 Gmail 邮件 ID?
- python - Flask-Admin File Admin 在保存编辑时添加了额外的行间距
- sql - 在 bigquery 中聚合行时,我想优先考虑某些关键字并提取不同的列
- angular - qlik 报告从 Qlik hub 到 web 应用程序
- vue.js - 从突变访问 Vue 实例失败
- javascript - Node.js 嵌套函数范围问题-> 将数据流管道获取到文件
- deployment - 部署预训练的视觉模型
- flutter-test - 如何在flutter中使用integration_test包在flutter中进行滚动测试?
- laravel - 发生 Laravel 迁移不兼容错误。但两种类型似乎都兼容
- google-cloud-platform - 尽管允许防火墙中的端口,iperf3 仍无法正常工作