Der folgende Code Abfrage gegeben:Django Modell Subklassifizieren: Erhalten Sie die Unterklasse von der übergeordneten Klasse
class BaseMedium(models.Model):
title = models.CharField(max_length=40)
slug = models.SlugField()
class A(BaseMedium):
url = models.URLField()
class B(BaseMedium):
email = models.EmailField()
Ich möchte jetzt jedes BaseMedium abfragen.
b = BaseMedium.objects.all()
Wie drucke ich alle Informationen einschließlich der Unterklassenfelder, ohne zu wissen, was der Unterklasse-Typ ist?
b[0].a
würden die Informationen drucken, wenn b[0]
tatsächlich zu einer A
Instanz verwandt ist, aber wenn es zu B
verwandt ist wäre es eine DoesNotExist
Ausnahme drucken.
Dies ist sinnvoll, aber ich möchte eine gemeinsame Variable oder Methode haben, die das zugehörige Objekt zurückgibt.
Vielleicht ist mein Datenbank-Layout nicht wirklich toll, um so zu fragen, wenn ja, würde ich mich freuen, wenn Sie ein besseres Layout empfehlen würden.
Ich dachte über eine GenericForeignKey
class Generic(models.Model):
basemedium = models.ForeignKey('BaseMedium')
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
object = generic.GenericForeignKey('content_type', 'object_id')
verwenden, aber diese Lösung scheint kompliziert und ich glaube, Sie Jungs haben bessere Lösungen zu sein.
Sie sollten vorsichtig mit diesem sein. Wenn Sie 1000 Datensätze haben, die aus DB abgerufen werden sollen, wird dies in einem SELECT durchgeführt, aber dann werden 1000 einzelne Selects sein, um den Subtyp für jedes BaseMedium-Objekt zu erhalten. Jedenfalls weiß ich keine bessere Idee, wie man das macht. Ich benutze etwas similar, das viele zusätzliche db-Abfragen erzeugt ... – dzida
schießen Sie haben Recht. Benutzerdefinierte sql könnte eine Option sein ... Die seltsame Sache ist, ich verstehe nicht, wie das ist kein allgemein bekanntes Problem mit bekannten Lösung. – rotrotrot