2017-02-03 3 views
0

Ich weiß, es gibt bereits eine ähnliche question, aber ich denke, mein Fall ist ein bisschen komplizierter, weil ich einen anderen Einstiegspunkt habe.Django: prefetch_related() mit m2m durch Beziehung v2

Das sind meine Modelle:

class m_Interaction(models.Model): 
    fk_ip = models.ForeignKey('m_IP', related_name="interactions") 

class m_User(models.Model): 
    name = models.CharField(max_length=200) 

class m_IP(models.Model): 
    fk_user = models.ForeignKey('m_User', related_name="ips") 

class m_Feature(models.Model): 
    name = models.CharField(max_length=200) 
    m2m_interaction = models.ManyToManyField(m_Interaction, related_name='features', through='m_Featurescore') 

class m_Featurescore(models.Model): 
    score = models.FloatField(null=False) 
    fk_interaction = models.ForeignKey(m_Interaction, related_name='featurescore') 
    fk_feature = models.ForeignKey(m_Feature, related_name='featurescore') 

ich mit m_User beginnen, folgen Sie der umgekehrte Beziehung über m_IP zu den Wechselwirkungen (m_Interaction). Dann möchte ich jeden m_Featurescore.score für jede Interaktion für eine bestimmte Instanz von m_Feature abrufen.

Meine Arbeits Abfrage Zugang zumindest alle Interaktionen in einer performanten Weise:

m_User.objects.all().prefetch_related('ips__interactions') 

Aber ich kann die korrekte ‚prefetch_related'-Anweisung nicht herausfinden, die m_Featurescore.score zugreifen wie diese

db_obj_interaction.featurescore.get(fk_feature=db_obj_feature).score 

ohne viele Fragen zu stellen.

Ich habe bereits versucht fast alle Kombinationen der folgenden:

'ips__interactions__features__featurescore' 

Irgendwelche Vorschläge?

+1

Wie wäre es ‚ips__interactions__featurescore‘ wie vorgeschlagen verwendet werden? Wenn Sie die Methode get() verwenden, erzwingen Sie, dass das ORM eine Abfrage erstellt. Sie müssen die all() -Methode verwenden, um den Prefetch zu nutzen. Wenn Sie eine Filterung benötigen, verwenden Sie ein Prefetch() -Objekt. – noamk

+0

@noamk perfekt. Vielen Dank! –

Antwort

0

ich die Antwort auf meine eigene Frage mit Hilfe von noamk in den Kommentaren gefunden:

habe ich nicht der Ansicht, dass die get() - Methode in db_obj_interaction.featurescore.get(fk_feature=db_obj_feature).score eine neue Abfrage jedes Mal ausstellen wird es genannt wird (es ist irgendwie offensichtlich jetzt).

Deshalb habe ich einfach meinen Code umstrukturiert und jetzt brauche ich nicht mehr get() und kann den Vorteil des Prefetch nutzen.

Wenn jemand noch die Prefetch()-object filtern muss sollte noamk

Verwandte Themen