10

Ich habe zwei Modelle Artikel und Blog mit einem Fremdschlüssel verwandt. Ich möchte beim Extrahieren des Artikels nur den Namen des Blogs auswählen.Auswahl bestimmter Felder mit select_related in Django

articles = Articles.objects.all().select_related('blog__name') 

Die generierte Abfrage zeigt, dass alle Felder aus dem Blog-Modell ausgewählt wurden. Ich habe versucht mit nur() und defer() mit select_related aber beide haben nicht geklappt.

articles = Articles.objects.all().select_related('blog__name').only('blog__name', 'title', 'create_time') 

Die obige Abfrage ergab Fehler: ungültiger Feldname (n) in select_related gegeben: Zur Wahl stehen: Blog

Wie erstelle ich eine Abfrage, so dass nur Artikel Felder und Blog-Name ausgewählt ist?

+0

Ich glaube nicht, es ist möglich - die Dokumentation für 'only' zeigen keine Beispiele für durchqueren Beziehungen, während die Dokumentation für' select_related' nur Beispiele zeigen mehrere Beziehungen (dh 'rel__rel' durchqueren, nicht 'rel__field'). scheint das Beste zu sein, was Sie tun können: 'articles = Articles.objects.all(). select_related ('blog'). only ('blog', 'title', 'create_time')' – Anentropic

+0

Was ist der Zweck, dies zu tun? Leistungsoptimierung? Sie können dies jedoch mit 'prefetch_related' machen, aber auf diese Weise erhalten Sie 2 Abfragen anstatt einer. 'Articles.objects.all(). Prefetch_related (Prefetch ('blog', querieset = Blog.objects.all(). Nur ('name')))' – Todor

+0

Der einzige Zweck war, die Leistung zu optimieren. Ich benutze bereits select_related, aber es gibt alle Attribute, die viel Speicher verbrauchen. Gibt es einen anderen Weg, dies zu tun? – RA123

Antwort

8

Sie annotate() dafür verwenden können.

>>> a = Articles.objects.annotate(blog_name=F('blog__name')).first() 
>>> a.title 
>>> a.blog_name 
5

select_related sollte auf das ganze Modell verwendet werden, und dann können Sie es mehr filtern. Dies funktioniert:

Articles.objects.select_related('blog').only('blog__name', 'title', 'create_time') 
+1

Die Verwendung von .values ​​gibt das Wörterbuch anstelle des queryset-Objekts zurück, wodurch die Verwendung von Beziehungen wie 'file.url' oder 'file.name' in den Vorlagen oder in der Ansicht unbrauchbar wird. Gibt es einen anderen Weg? – RA123

+0

@ RA123 Ich habe meine Antwort bearbeitet. Versuchte es und so funktioniert es für mich –

+0

Dies funktioniert auch nicht. Ich bin auf Django 1.8. Es gibt den folgenden Fehler - "Ungültige Feldname (n) in select_related: 'Blog'. Auswahlmöglichkeiten sind: blog" Wenn ich '__name' von 'blog__name' in 'nur' lösche, funktioniert es gut, aber ruft alle Felder ab. – RA123

Verwandte Themen