2009-07-14 6 views
1

Angenommen, ich habe die folgenden Modelle:Generisches Objekt „Eigentum“ in Django

class User(models.Model): 
    pass 

class A(models.Model): 
    user = models.ForeignKey(User) 

class B(models.Model): 
    a = models.ForeignKey(A) 

Das heißt, jeder Benutzer einige Objekte vom Typ A besitzt, und auch einige vom Typ B. Nun, ich schreibe ein generische Schnittstelle, die es dem Benutzer ermöglicht, alle Objekte anzuzeigen, die ihm gehören. In einer Ansicht kann ich natürlich nicht etwa "objects = model.objects.filter (user = user)" sagen, da B kein Attribut "user" hat. Was ist der beste Ansatz hier zu nehmen?

Antwort

0

So wie ich das tun würde, es ist einfach durch das Objekt gehen ‚a‘ auf Klasse B. in der Ansicht Also, ich tun würde:

objects = B.objects.get(user=a.user) 
objects += A.objects.get(user=user) 

Der Grund, warum ich es auf diese Weise ist tun würde, weil Dies sind im Wesentlichen zwei Datenbankabfragen, eine zum Abrufen einer Menge von Objekten A und eine zum Abrufen einer Menge von Objekten B. Ich bin nicht sicher, ob es in Django möglich ist, eine Liste von beiden zu erhalten, einfach wegen der Art, wie die Datenbankvererbung funktioniert.

Sie könnten auch model inheritance verwenden. Dies würde eine Basisklasse für beide Objekte A und B bilden, die die allgemeinen Felder enthält, und dann eine Liste der Basisklassen abrufen und dann in ihre richtigen Typen konvertieren.

Edit: Als Antwort auf Ihren Kommentar, ich schlage vor, dass dann eine Basisklasse, die diese Zeile enthält:

user = models.ForeignKey(User) 

der Klasse A und B kann dann von dieser Basisklasse erben, und Sie können damit jetzt Holen Sie einfach alle Objekte aus dieser Klasse. Sagen Sie Ihre Basisklasse wurde ‚C‘ genannt:

objects = C.objects.get(user=user) 

Das wird alle von der Cs erhalten, und Sie können dann herausfinden, ihre spezifischen Typen von in Objekten durch jedes Objekt gehen und die Bestimmung ihrer Art:

for object in objects: 
    if object.A: 
     #code 
    if object.B: 
     #code 
+0

Ich brauche dies zu generisch, so dass die Ansicht nicht direkt weiß, dass B ein Objekt des Typs A enthält. Es muss nur einen Modellnamen und einen Benutzer gegeben werden, und eine Liste der Objekte, die der Benutzer besitzt . –

+0

Siehe meine Bearbeitung in meinem Beitrag oben. – AlbertoPL

+0

Danke, ich denke, das wird funktionieren. Ich glaube, ich habe das Gefühl, dass ich das Objektmodell irgendwie verschmutze, da jedes Objekt konzeptionell kein "Benutzer" -Attribut haben muss, wie es ohne es abgeleitet werden könnte. –

Verwandte Themen