Django: ForeignKey mit 0 als None ?

Django, Flask, Bottle, WSGI, CGI…
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

phpBB speichert leider beim "leeren" ForeignKey kein None bzw. DB-Null, sondern die Zahl 0

Wie kann ich in Django ein eigene ForeignKey Klasse implementieren, die das akzeptiert? Denn das ORM versucht halt den ForeignKey mit der ID == 0 zu holen, die es natürlich nicht gibt.

Ich hab es so probiert:

Code: Alles auswählen

class PhpBBForeignKey(models.ForeignKey):
    def to_python(self, value):
        if value in ("", None, 0):
            return None
        return super(PhpBBForeignKey, self).to_python(value)

    def get_db_prep_save(self, value, connection):
        if value in ("", None, 0):
            return None
        return super(PhpBBForeignKey, self).get_db_prep_save(value, connection)
Das bringt es allerdings nicht ganz.

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:

Denke ich hab eine Lösung gefunden, mit einem eigenen ReverseSingleRelatedObjectDescriptor:

Code: Alles auswählen

class PhpBBReverseSingleRelatedObjectDescriptor(models.fields.related.ReverseSingleRelatedObjectDescriptor):
    def __get__(self, instance, instance_type=None):
        if instance is None:
            return self

        try:
            return getattr(instance, self.cache_name)
        except AttributeError:
            val = getattr(instance, self.field.attname)
            if val in (0, None, ""):
                return None

        return super(PhpBBReverseSingleRelatedObjectDescriptor, self).__get__(instance, instance_type)


class PhpBBForeignKey(models.ForeignKey):
    def to_python(self, value):
        if value in ("", None, 0):
            return None
        return super(PhpBBForeignKey, self).to_python(value)

    def get_db_prep_save(self, value, connection):
        if value in ("", None, 0):
            return None
        return super(PhpBBForeignKey, self).get_db_prep_save(value, connection)

    def contribute_to_class(self, cls, name):
        super(PhpBBForeignKey, self).contribute_to_class(cls, name)
        setattr(cls, self.name, PhpBBReverseSingleRelatedObjectDescriptor(self))
Anmerkungen? Geht das einfacher?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Ernsthaft? "UPDATE table SET fk=NULL WHERE fk=0"
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

apollo13 hat geschrieben:Ernsthaft? "UPDATE table SET fk=NULL WHERE fk=0"
+1. Verstehe auch nicht warum man das schlechte phpBB-DB-Layout in ein djangoBB-DB-Layout übernehmen sollte.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Weil django-phpBB die bestehenden Daten am besten nicht ändern sollte. Es geht bei dem Projekt nicht nur um die einmalige Migration (Wobei das mein persönliches Hauptanliegen ist)... Vielmehr sollte man django-phpBB auch dazu nutzen können, parallel auf die Daten zugreifen zu können.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Das finde ich ist ein sinnloser Usecase, wenn man dadurch unnötig die Komplexität des Codes erhöht. Wer will denn phpBB und DjangoBB gleichzeitig betreiben?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten