2017-12-21 1 views
1

Ich versuche eine ziemlich lange Verbindung zu machen, aber es scheint, als ob django nicht mit der letzten Schicht umgehen kann. Komme ich falsch oder geht es anders herum?Django und multiple Joins

Models.py

class A(models.Model): 
    object_id = models.IntegerField(primary_key=True) 
    name = models.CharField(max_length=50) 

class B(models.Model): 
    class_A_object = models.ForeignKey(A, on_delete=models.PROTECT) 
    value = models.CharField(max_length=50) 

class C(models.Model): 
    class_B_object = models.ForeignKey(B, on_delete=models.PROTECT) 

class D(models.Model): 
    value= models.IntegerField(primary_key=True) 
    class_C_object = models.ForeignKey(C, on_delete=models.PROTECT) 

ich dann versuchen, den Wert in der Klasse D, wenn die betreffende Klasse A Objektnamen auszuwählen = ABC.

D.objects.filter(class_C_object__class_B_object__class_A_object__name='ABC') 

dies nicht gelingt, sie mit PyCharm weigert sich, die die automatische Vervollständigung beginnen und wenn ich es laufen bekomme ich einen Namen Fehler nicht definiert.

Wenn ich jedoch eine Ebene fallen lassen, funktioniert es.

D.objects.filter(class_C_object__class_B_object__value='ABC') 

Ich habe keine Unterlagen zu erwähnen, eine maximale Anzahl von Verknüpfungen gefunden, aber es fühlt sich an wie es hier eine Beschränkung ist.

Weiß jemand, ob das der Fall ist, und wenn ja, was wäre der beste Weg, um dies zu umgehen?

Die Datenbank ist extern für mich und kann nicht geändert werden. Die einzige funktionierende Lösung, die ich im Moment habe, besteht darin, den Cursor direkt zu verwenden und die SQL von Hand zu schreiben. Dies ist jedoch aus vielen Gründen nicht ideal.

Jede Hilfe würde sehr geschätzt werden.

Mit freundlichen Grüßen, Peter

+0

Post genaue Traceback-Fehler – itzMEonTV

Antwort

0

Ich habe dieses Problem gelöst, vielleicht nicht die sauberste Lösung, sondern durch eine queryset von passendem Namen ABC bekommt und dann mit, dass queryset für einen __in Filter auf D, um das Ergebnis erhalten Ich mag und es ist nur eine Abfrage.

Es funktioniert, und ist effizient, aber der Code ist nicht sehr sauber. Wenn jemand einen Vorschlag für einen anderen Weg hat, würde ich mich sehr freuen zu hören.

Danke, Peter