2017-04-17 3 views
0

I Angepasste Benutzermodell und zwei Modelle haben, die beide mit ForeinKey zu zwei Benutzer gleichzeitig:Wie komplex zu tun kommen in Django

class Feature1(models.Model): 
    user1 = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='u1') 
    user2 = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='u2') 

    some field.... 
    percentage = models.FloatField() 

class Feature2(models.Model): 
    user1 = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='us1') 
    user2 = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='us2') 

    some fields... 
    property = models.PositiveIntegerField() 

und dann rufe ich alle Paare für bestimmte Benutzer mit queryset

queryset = Feature1.objects.filter(u1=self.request.user).all().order_by('-percentage') 

aber, was ich brauche, auch in diesen queryset Daten aus Feature2 Modell zu haben (für jedes bestimmtes Benutzerpaar, liegt vor, wenn) und in der Lage, um queryset zu sein von ‚Eigentum‘ von Feature2

Wie geht das? Ich habe django docs recherchiert, aber ohne Ergebnis.

+0

Haben Sie sich in mit 'select_related()'? –

+0

Wahrscheinlich ist es das, aber ich weiß nicht, wie man es richtig benutzt. Mein Fall ist nicht so einfach wie in Django-Beispielen. –

+0

Wünschen Sie alle Felder in 'Feature2', wobei' user1' in 'Feature2' gleich' user1' in 'Feature1' ist und' user2' in 'Feature2' gleich' user2' in 'Feature1' ist? –

Antwort

1

Ein Versuch wäre, zuerst alle der user1s und user2s aus der ersten Beziehung zu erhalten

u1 = Feature1.objects.all().values_list('user1', flat=True) 
u2 = Feature1.objects.all().values_list('user2', flat=True) 

und dann bekommen die Feature2 Objekte aus der zweiten Beziehung, die diese Benutzer

queryset = Feature2.objects.filter(user1__in=u1, user2__in=u2).order_by('-percentage') 

I entsprechen Ich möchte auch eine Alternative zu Ihrem Datenbankdesign anbieten, die Ihnen helfen wird, Ihre Modelle effizienter abzufragen. Warum Feature2 nicht so ändern, dass es ein ForeignKey-Feature1 wie so

class Feature2(models.Model): 
    feature1 = models.ForeignKey(Feature1, verbose_name="Feature 1") 

    ... 

Dann könnte man die beiden auf diese Weise verbinden

queryset = Feature2.objects.filter(feature1__in=Feature1.objects.filter(u1=self.request.user)).order_by('-percentage') 
+0

Dies ist ein Nested-Loop-Join. Jeder Weg, es effizienter zu machen? – sudo

+0

Es ist der Weg, aber statt einer Abfrage haben wir viele. Ich würde es gerne mit einer Abfrage zu db tun (postgresql in meinem Fall). –

+0

Ich muss auf dich zurückkommen. @sudo, ich bin mir sicher, dass es einen effizienteren Weg gibt, aber es ist, was ich aus meinem Kopf heraus gefunden habe. –