Django:id字段的值即将到来None

时间:2019-03-01 06:57:11

标签: django django-models

我想为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)

这对我有用...谢谢大家

2 个答案:

答案 0 :(得分:5)

为什么 self.id None

这是因为Django在创建对象后(即在调用 {{ 1}} 的模型方法。

因此,请调用 id 方法,然后尝试执行以下逻辑操作

pk

更新
我有一个观点,即在调用 save() 方法之后,应再次更新实例。所以我用了这个语句

save()

感谢@sanip的回答所带来的灵感

答案 1 :(得分:2)

要获取id,您需要尝试@JPG提供的答案。但是由于save()方法是在初始步骤中调用的,因此urlhash可能不会更新,因为它没有保存在实例中。要更新urlhash,您可以执行以下操作:

def save(self):
    super(Group1, self).save()
    if not self.urlhash:
        if self.user.profile.user_type == 'Business User':
            urlhash = 'B' + str(self.User.id) + ('00') + str(self.id)
            Group1.objects.filter(pk=self.pk).update(urlhash=urlhash)
        else:
            self.urlhash = 'P' + str(self.User.id) + ('00') + str(self.id)
            Group1.objects.filter(pk=self.pk).update(urlhash=urlhash)