Nil*_*Kar 0 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)
Run Code Online (Sandbox Code Playgroud)
这是我给出的功能:
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()
Run Code Online (Sandbox Code Playgroud)
但是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)
Run Code Online (Sandbox Code Playgroud)
这适合我...谢谢大家
为什么self.id是None?
这是因为Django 在创建对象之后分配id/ pk值,即在调用save()模型方法之后.
因此,调用该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)
Run Code Online (Sandbox Code Playgroud)
更新
我得到一点,在调用save()方法后应该再次更新实例.所以我使用了这个陈述
self.__class__.objects.filter.(pk=self.pk).update(urlhash=urlhash)
Run Code Online (Sandbox Code Playgroud)
感谢@sanip从他的回答得到的想法