3 Stimmen

django: wie man ein bestehendes Modell erweitert

Es gibt viele Beispiele, die Ihnen zeigen, wie Sie das Benutzermodell erweitern können, ABER ich kann kein echtes, vollständiges und dokumentiertes Beispiel dafür finden, wie man ein bestehendes Modell erweitern kann, ohne dem "Benutzerprofilmuster" folgen zu müssen (und ehrlich gesagt frage ich mich, warum).

Kurz gesagt, mein Anwendungsfall ist der folgende: Ich muss das Produktmodell von django-lfs erweitern.

In LFS ist sie wie folgt registriert (in lfs.catalog.admin):

from django.contrib import admin

[...]
from lfs.catalog.models import Product
[...]
class ProductAdmin(admin.ModelAdmin):
    prepopulated_fields = {"slug": ("name", )}
admin.site.register(Product, ProductAdmin)
[...]

Ich habe versucht, meine (die Unterklasse) zu registrieren, aber ich bekam:

django/contrib/admin/sites.py", Zeile 78, in register raise AlreadyRegistered('Das Modell %s ist bereits registriert' % Modell. Name )

Also schlug mir jemand vor, dass ich dieses Objekt abmelden und mein eigenes registrieren sollte.

Ich habe es so gemacht:

from lfs.catalog.models import Product
from lfs.catalog.admin import ProductAdmin

admin.site.unregister(Product)

from lfs_product_highlights.catalog.models import Product

admin.site.register(Product,ProductAdmin)

Diesmal keine Fehler, ABER es gibt keine Änderung, meine benutzerdefinierten Felder sind nirgends zu sehen.

Irgendwelche Hinweise?

3voto

Daniel Roseman Punkte 565786

Der Grund, warum das so schwierig ist, liegt in den objektbezogene Impedanzfehlanpassung (ich liebe diesen Satz). Objekte und Klassen tun pas perfekt auf relationale Datenbanken abbilden: ORMs wie Django versuchen, die Kanten zu glätten, aber es gibt einige Stellen, an denen die Unterschiede einfach zu groß sind. Vererbung ist eine davon: Es gibt einfach keine Möglichkeit, eine Tabelle von einer anderen "erben" zu lassen, also muss dies über Foreign Keys oder ähnliches simuliert werden.

Wie auch immer, für Ihr eigentliches Problem, ich kann nicht wirklich sehen, was los ist, aber ein möglicher Weg, um es zu beheben wäre, um die Unterklasse ProductAdmin als gut, und speziell setzen die model Attribut an Ihr unterklassifiziertes Modell.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X