Django model.META.unique_together

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten