Django模型 - 以小写形式设置默认字符串

Kri*_*adi 14 django django-models

如何设置小写的默认字符串?这是我的模特:

class User(models.Model):
    username = models.CharField(max_length=100, unique=True)
    password = models.CharField(max_length=64)
    name = models.CharField(max_length=200)
    phone = models.CharField(max_length=20)
    email = models.CharField(max_length=200)

    def __init__(self, *args, **kwargs):
        self.username = self.username.lower()
Run Code Online (Sandbox Code Playgroud)

我试过了,__init__但它不起作用.我希望每次保存新记录时都使用小写的用户名.谢谢.

Avi*_*Raj 20

只需在save方法中执行.即,重写类的save方法Model.

def save(self, *args, **kwargs):
    self.username = self.username.lower()
    return super(User, self).save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

  • 不,不是的.最近对此答案的编辑应该被还原,因为它不正确.来自django文档:"请注意,update()方法直接转换为SQL语句.它是直接更新的批量操作.它不会在模型上运行任何save()方法,或者发出pre_save或post_save signals"(来源:https://docs.djangoproject.com/en/dev/topics/db/queries/#updating-multiple-objects-at-once) (8认同)
  • 重要的是要指出这只有在模型更新通过保存时才有帮助.如果您编写的代码在查询集上执行.update(),则不会进行保存,因此仍然可以在数据库字段中使用大写字母. (5认同)

Dan*_*nil 18

而覆盖save()方法是一种有效的解决方案.我发现在一个Field级别处理它是有用的,而不是Model通过覆盖get_prep_value()方法处理级别.

这样,如果您希望在不同的模型中重用此字段,则可以采用相同的一致策略.此外,逻辑与save方法分开,您可能还希望为不同目的覆盖该方法.

对于这种情况,你会这样做:

class NameField(models.CharField):
    def __init__(self, *args, **kwargs):
        super(NameField, self).__init__(*args, **kwargs)

    def get_prep_value(self, value):
        return str(value).lower()

class User(models.Model):
    username = models.CharField(max_length=100, unique=True)
    password = models.CharField(max_length=64)
    name = NameField(max_length=200)
    phone = models.CharField(max_length=20)
    email = models.CharField(max_length=200)
Run Code Online (Sandbox Code Playgroud)