Unique model field in Django and case sensitivity (postgres)

前端 未结 10 774
时光取名叫无心
时光取名叫无心 2020-12-13 13:37

Consider the following situation: -

Suppose my app allows users to create the states / provinces in their country. Just for clarity, we are considering only ASCII ch

10条回答
  •  北荒
    北荒 (楼主)
    2020-12-13 14:12

    Alternatively you can change the default Query Set Manager to do case insensitive look-ups on the field. In trying to solve a similar problem I came across:

    http://djangosnippets.org/snippets/305/

    Code pasted here for convenience:

    from django.db.models import Manager
    from django.db.models.query import QuerySet
    
    class CaseInsensitiveQuerySet(QuerySet):
        def _filter_or_exclude(self, mapper, *args, **kwargs):
            # 'name' is a field in your Model whose lookups you want case-insensitive by default
            if 'name' in kwargs:
                kwargs['name__iexact'] = kwargs['name']
                del kwargs['name']
            return super(CaseInsensitiveQuerySet, self)._filter_or_exclude(mapper, *args, **kwargs)
    
    # custom manager that overrides the initial query set
    class TagManager(Manager):
        def get_query_set(self):
            return CaseInsensitiveQuerySet(self.model)
    
    # and the model itself
    class Tag(models.Model):
        name = models.CharField(maxlength=50, unique=True, db_index=True)
    
        objects = TagManager()
    
        def __str__(self):
            return self.name
    

提交回复
热议问题