Seite 1 von 1

Django model.META.unique_together

Verfasst: Montag 13. Juli 2009, 13:10
von jens
Im django model kann man unique-together nutzten:
http://docs.djangoproject.com/en/dev/re ... e-together

Jedoch ist das Datenbank abhängig, ob es auch zu einem Fehler kommt, wenn doppelte Einträge erzeugt werden.

Nun habe ich mir ein signal handler gebaut, der es manuell überprüft:

Code: Alles auswählen

def check_unique_together(sender, **kwargs):
    instance = kwargs["instance"]
    for field_names in sender._meta.unique_together:
        model_kwargs = dict([(field_name, getattr(instance, field_name)) for field_name in field_names])
        count = sender.objects.filter(**model_kwargs).count()
        if count > 0:
            field_names = get_text_list(field_names, _('and'))
            msg = _(u"%(model_name)s with this %(field_names)s already exists.") % {
                'model_name': unicode(instance.__class__.__name__),
                'field_names': unicode(field_names)
            }
            raise IntegrityError(msg)
Es wäre ja eigentlich unsinnig den zu benutzten, wenn die DB es selber kann. Deswegen hab ich sowas gemacht:

Code: Alles auswählen

def auto_add_check_unique_together(model_class):
    """
    Add only the signal handler check_unique_together, if a database without UNIQUE support is used.
    """
    if settings.DATABASE_ENGINE in ('sqlite3',):    # 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.
        signals.pre_save.connect(check_unique_together, sender=model_class)
Ich Frage mich allerdings, welche DB's es können und welche nicht. Bei SQLite geht es offensichtlich nicht.

In connection.features ist keine Angabe darüber erhalten. Wie komme ich an die Info's aus django herran?

Re: Django model.META.unique_together

Verfasst: Donnerstag 31. Mai 2012, 12:59
von jens
(...alte sachen aufwärm...)

Ich bin gerade etwas verwirrt. Ich dachte immer das SQLite UNIQUE nicht unterstützt. Doch das ist seit v2.0 von 2001 nicht so, siehe: https://www.sqlite.org/changes.html (Bei 2001 Sep 27 (2.0-alpha-3))

War das ehr eine Limitierung im Django ORM, welches das nicht genutzt hat?

Ansonsten macht es keinen Sinn das manuell zu prüfen, wie mit https://github.com/jedie/django-tools/b ... l_utils.py Sondern nimmt einfach unique_together und gut.