Django模型-将默认字符域设置为小写

xpszyzbs  于 2022-12-14  发布在  Go
关注(0)|答案(4)|浏览(114)

如何设置默认字符域为小写?这是我的模型:

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

我试过__init__,但它不工作。我想使用户名在小写每次新记录保存。谢谢。

waxmsbnn

waxmsbnn1#

虽然覆盖save()方法是一个有效的解决方案。我发现在Field级别上处理这个问题是有用的,而不是通过覆盖get_prep_value()方法在Model级别上处理这个问题。
这样,如果您希望在不同的模型中重用该字段,您可以采用相同的一致策略。此外,逻辑与保存方法分离,您可能还希望出于不同的目的覆盖save方法。
对于这种情况,您可以执行以下操作:

class NameField(models.CharField):

    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)
2o7dmzc5

2o7dmzc52#

只需在保存方法中执行此操作。即,覆盖Model类的save方法。

def save(self, *args, **kwargs):
    self.username = self.username.lower()
    return super(User, self).save(*args, **kwargs)
jqjz2hbq

jqjz2hbq3#

信号也起作用

from django.db.models.signals import pre_save

@receiver(pre_save, sender=YourModel)
def to_lower(sender, instance=None, **kwargs):
    instance.text = instance.text.lower() if  \
        isinstance(instance.text, str) else ''
pxq42qpu

pxq42qpu4#

def save(self, force_insert=False, force_update=False):
        self.YourFildName = self.YourFildName.upper()
        super(YourFomrName, self).save(force_insert, force_update)

相关问题