Case insensitive unique model fields in Django?

后端 未结 7 2122
我寻月下人不归
我寻月下人不归 2020-12-02 11:23

I have basically a username is unique (case insensitive), but the case matters when displaying as provided by the user.

I have the following requirements:

7条回答
  •  情歌与酒
    2020-12-02 11:44

    Since a username is always lowercase, it's recommended to use a custom lowercase model field in Django. For the ease of access and code-tidiness, create a new file fields.py in your app folder.

    from django.db import models
    from django.utils.six import with_metaclass
    
    # Custom lowecase CharField
    
    class LowerCharField(with_metaclass(models.SubfieldBase, models.CharField)):
        def __init__(self, *args, **kwargs):
            self.is_lowercase = kwargs.pop('lowercase', False)
            super(LowerCharField, self).__init__(*args, **kwargs)
    
        def get_prep_value(self, value):
            value = super(LowerCharField, self).get_prep_value(value)
            if self.is_lowercase:
                return value.lower()
            return value
    

    Usage in models.py

    from django.db import models
    from your_app_name.fields import LowerCharField
    
    class TheUser(models.Model):
        username = LowerCharField(max_length=128, lowercase=True, null=False, unique=True)
    

    End Note : You can use this method to store lowercase values in the database, and not worry about __iexact.

提交回复
热议问题