2017-01-02 7 views
3

Ich habe ein einfaches Relation-Modell, wo ein Benutzer ein Tag genau wie stackoverflow folgen kann.Query intermediate durch Felder in Django

class Relation(models.Model): 
    user = AutoOneToOneField(User) 
    follows_tag = models.ManyToManyField(Tag, blank=True, null=True, through='TagRelation') 

class TagRelation(models.Model): 
    user = models.ForeignKey(Relation, on_delete=models.CASCADE) 
    following_tag = models.ForeignKey(Tag, on_delete=models.CASCADE) 
    pub_date = models.DateTimeField(default=timezone.now) 

    class Meta: 
     unique_together = ['user', 'following_tag'] 

nun die Ergebnisse aller Tags erhalten ein Benutzer folgt:

kakar = CustomUser.objects.get(email="[email protected]") 
tags_following = kakar.relation.follows_tag.all() 

Das ist in Ordnung.

Aber um auf Zwischenfelder zuzugreifen, muss ich eine große Liste von anderen Abfragen durchlaufen. Angenommen, ich angezeigt werden soll, wenn der Benutzer begonnen, einen Tag folgt, werde ich habe, so etwas zu tun:

kakar = CustomUser.objects.get(email="[email protected]") 
kakar_relation = Relation.objects.get(user=kakar) 
t1 = kakar.relation.follows_tag.all()[0] 
kakar_t1_relation = TagRelation.objects.get(user=kakar_relation, following_tag=t1) 
kakar_t1_relation.pub_date 

Wie Sie sehen können, nur das Datum bekommt ich so viel durch Abfrage gehen. Ist dies der einzige Weg, um Zwischenwerte zu erhalten, oder kann dies optimiert werden? Ich bin mir auch nicht sicher, ob dieses Modell Design ist der Weg zu gehen, also wenn Sie irgendwelche Empfehlungen oder Ratschläge hätte, wäre ich sehr dankbar. Vielen Dank.

Antwort

1

Sie müssen Doppelstrich dh (__) für ForeignKey Suche verwendet werden, So:

user_tags = TagRelation.objects.filter(user__user__email="[email protected]").values("following_tag__name", "pub_date") 

Wenn Sie den Namen des Tags benötigen, können Sie following_tag__name in der Abfrage verwenden können, und wenn Sie ID benötigen Sie können following_tag__id verwenden.

Und dafür müssen Sie durch das Ergebnis der obigen Abfrage Satz wiederholen, wie folgt aus:

for items in user_tags: 
    print items['following_tag__name'] 
    print items['pub_date'] 

Eine weitere Sache, das Schlüsselwort Werte wird eine Liste von Wörterbücher zurückkehren und Sie können Iterieren Sie es durch obige Methode und wenn Sie values_list anstelle von Werte verwenden, wird es eine Liste von Tupel zurückgeben. Read further from here.

Verwandte Themen