2014-02-12 17 views
1

我需要一個SlugField這是可選的,如果不爲空,它應該是唯一的。可選的,但獨特的SlugField

如果我走的Django SlugField,空字符串是允許的,會有在數據庫中一個空字符串。但是,如果它是唯一的,則只允許一個空字符串的行。

我的SlugField應該是唯一的,如果它被設置,或者NoneNULL)如果它沒有被設置。

在數據庫級它的工作原理:唯一性約束忽略NULL值。

因爲我不想修改的地方太多,數據庫字段將是最好的解決方案。

+0

你可以淨化你的數據,並確保空字符串轉換/保存爲'None' – dm03514

+0

你有沒有嘗試使用['空= TRUE;(HTTPS:/ /docs.djangoproject.com/en/dev/ref/models/fields/#null)? –

+0

@ThomasOrozco我現在不在工作,我沒有在這裏的來源。但據我所知我用'SlugField(空=真,獨特=真,空=真)' – guettli

回答

0

這裏是我的解決方案:

from django.db.models import SlugField 

# Inspired by: https://github.com/django-extensions/django-extensions/blob/master/django_extensions/db/fields/__init__.py 

class SlugOrNullField(SlugField): 
    ''' 
    Don't insert empty slugs. If the slug is empty, insert NULL. 

    Usecase: Unique, but optional slug. Unique constrains only applies 
      to the values which are not NULL. 

    class MyModel(models.Model): 
     slug = SlugField(null=True, unique=True, blank=True) 

    If you want to be really sure, that no empty slug is in your table, you can use this 
    in a schema migration (south): 

    def forwards(self, orm): 
     db.execute("ALTER TABLE myapp_foomodel add CONSTRAINT slug_not_empty CHECK (slug<>'')") 

    If you have a empty slug in your table, you can use this in a data migration: 

    def forwards(self, orm): 
     db.execute("UPDATE myapp_foomodel SET slug=NULL WHERE slug='' ") 

    ''' 

    def get_prep_value(self, value): 
     value=value.strip() 
     if not value: 
      return None 
     return value 

    def get_internal_type(self): 
     return "SlugField" 

#South Plugin registrieren 
from south.modelsinspector import add_introspection_rules 
add_introspection_rules([], ["^djangotools\.dbfields\.SlugOrNullField"])