[英]How to override field before saving it in Django?
我在models.py
中有一个 class 用户:
class User(models.Model):
userId = models.CharField(primary_key=True, blank=False, max_length=100)
userId
总是带有前缀user#
,当有#
时,我无法从数据库中查询一个用户。 如果我理解正确,那甚至是不可能的,所以现在我尝试修改 save 方法,以便在没有user#
前缀的情况下保存userId
。 我在用户 class 下试过这个:
def save(self, *args, **kwargs):
userId = self.userId[5:]
print("USER_ID: ", userId)
super(User, self).save(*args, **kwargs)
这会正确打印 id,没有前缀,但在数据库中, userId
仍然与它一起保存。 我的保存方法有问题吗?
您应该将其保存到self.userId
:
def save(self, *args, **kwargs):
if self.userId.startswith('user#'):
self.userId = self.userId[5:]
super().save(*args, **kwargs)
前缀检查是必要的,否则每次保存 object 时都会删除前五个字符,因此最终字符串将为空。
话虽如此,Django ORM 并不总是调用.save(…)
来保存 object。 事实上,很多批量创建/更新项目的操作不会调用用户。
如果我用 hash ( #
) 查询 object,它会返回正确的项目:
>>> User.objects.create(userId='foo#bar')
<User: User object (1)>
NameError: name 'Unit' is not defined
>>> User.objects.filter(userId='foo#bar')
<QuerySet [<User: User object (1)>]>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.