Py学习  »  Django

如何在将字段保存到Django之前覆盖它?

lr_optim • 2 年前 • 740 次点击  

我有一个类用户 models.py :

class User(models.Model):
    userId = models.CharField(primary_key=True, blank=False, max_length=100)

这个 userId 总是带有前缀 user# 当数据库中有一个用户时,我无法从数据库中查询一个用户 # .如果我理解正确,这甚至是不可能的,所以现在我尝试修改save方法,以便 用户ID 如果没有 使用者# 前缀我在用户类下尝试了这个:

def save(self, *args, **kwargs):
    userId = self.userId[5:]
    print("USER_ID: ", userId)
    super(User, self).save(*args, **kwargs)

正确打印id,不带前缀,但在数据库中 用户ID 它仍然保存着。我的保存方法有问题吗?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/128441
 
740 次点击  
文章 [ 1 ]  |  最新文章 2 年前
Willem Van Onsem
Reply   •   1 楼
Willem Van Onsem    2 年前

你应该把它保存到 self.userId :

def save(self, *args, **kwargs):
    if self.userId.startswith('user#'):
        self.userId = self.userId[5:]
    super().save(*args, **kwargs)

前缀检查是必要的,否则将删除前五个字符 每个 保存对象时,字符串最终将为空。

尽管如此,Django ORM并不总是调用 .save(…) 保存一个对象。实际上,大量创建/更新项目的操作不会调用用户。

如果我用散列查询对象( # ),它将返回正确的项:

>>> 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)>]>