2017-03-23 2 views
0

Ich habe 2 Modelle. Charaktere und CharaktereDetails von einer Django-Site, mit der ich herumalbere.Django select_related Abfrage gibt nicht alle Werte an die Vorlage zurück

CharactersDetails eine foreignkey Beziehung zu Charakteren hat

class CharactersDetails(models.Model): 
    character_link = models.ForeignKey(Characters) 

Aus meiner Sicht ich das tue:

'character_info': CharactersDetails.objects.select_related('character_link').filter(character_link_id=pk) 

In meiner Vorlage, bin immer ich nur die Felder aus den CharactersDetails zurück Tabelle.

In der manage.py-Shell habe ich dieselbe Abfrage ausgeführt und festgestellt, dass sie tatsächlich die Felder von CharactersDetails und Characters zurückgibt (was ich will), aber wenn die Ansicht das Kontextobjekt erhält, werden nur die Elemente angezeigt aus der CharactersDetails-Tabelle.

(looking_for_guild_env)klainn:~/workspace (master) $ python manage.py shell 
Python 3.4.3 (default, Nov 17 2016, 01:08:31) 
>>> from players.models import Characters,CharactersDetails 
>>> myjunk = CharactersDetails.objects.select_related('character_link').filter(character_link_id=1) 
>>> print(myjunk) 
<QuerySet [<CharactersDetails: CharactersDetails object>]> 
>>> print(myjunk.query) 
SELECT "characters_details"."id", "characters_details"."character_link_id", "characters_details"."character_class_id", "characters_details"."character_race_id", "characters_details"."character_level", "characters_details"."character_armory_url", "characters_details"."character_profile_image_url", "characters_details"."character_profile_avatar_url", "characters_details"."character_profile_inset_url", "characters"."id", "characters"."character_owner_id", "characters"."character_name", "characters"."character_realm_id", "characters"."character_faction_id", "characters"."insert_date" FROM "characters_details" INNER JOIN "characters" ON ("characters_details"."character_link_id" = "characters"."id") WHERE "characters_details"."character_link_id" = 1 
>>> 

Ich nehme das gleiche Abfrage und in die manage.py dbshell einfügen:

(looking_for_guild_env)klainn:~/workspace (master) $ python manage.py dbshell 
sqlite> SELECT "characters_details"."id", "characters_details"."character_link_id", "characters_details"."character_class_id", "characters_details"."character_race_id", "characters_details"."character_level", "characters_details"."character_armory_url", "characters_details"."character_profile_image_url", "characters_details"."character_profile_avatar_url", "characters_details"."character_profile_inset_url", "characters"."id", "characters"."character_owner_id", "characters"."character_name", "characters"."character_realm_id", "characters"."character_faction_id", "characters"."insert_date" FROM "characters_details" INNER JOIN "characters" ON ("characters_details"."character_link_id" = "characters"."id") WHERE "characters_details"."character_link_id" = 1; 
1|1|15|7|110|http://us.battle.net/wow/en/character/Stormrage/Peppiwyn/simple|stormrage/219/182881755-profilemain.jpg|stormrage/219/182881755-avatar.jpg|stormrage/219/182881755-inset.jpg|1|3|Peppiwyn|192|0|2017-03-20 

Und ich alle Felder aus. Aber die Vorlage wird nicht die letzten 6 Werte übergeben. Das konnte ich sehen, wenn ich ein .values ​​() bis zum Ende des queryset hinzufügen und dann ein:

{{ character_info }} 

in der Vorlage sehe ich:

<QuerySet [{'id': 1, 'character_profile_image_url': 'stormrage/219/182881755-profilemain.jpg', 'character_race_id': 7, 'character_level': 110, 'character_profile_avatar_url': 'stormrage/219/182881755-avatar.jpg', 'character_profile_inset_url': 'stormrage/219/182881755-inset.jpg', 'character_armory_url': 'http://us.battle.net/wow/en/character/Stormrage/Peppiwyn/simple', 'character_link_id': 1, 'character_class_id': 15}]> 

Habe ich etwas falsch gemacht oder ist Gibt es einen besonderen Weg, ich sollte diese Werte aus der Vorlage aufrufen?

Danke fürs Lesen.

Antwort

0

select_related('character_link') Doing nicht die Attribute der character_info Instanz hinzufügen, es holt nur die character_info aus der db zugleich als character_link, indem eine innere Verknüpfung. In der Vorlage greifen Sie auf die character_link Instanz {{ character_info.character_link }} zu.

Wenn Sie values() verwenden, müssen Sie explizit Felder sind von character_link:

.values('field1', 'field2', 'character_link__field', ...) 
0

Die queryset Methode .values() nicht implizit fügt die Attribute der Fremdschlüssel ausgewählt. Hier ist ein extract of the documentation:

Ein paar Feinheiten, die erwähnenswert sind:

  • Wenn Sie ein Feld foo genannt, die ein ForeignKey ist, der Standard values() Anruf ein Wörterbuch Schlüssel namens foo_id zurückkehren wird, da dies der Name des versteckten Modellattributs ist, das den tatsächlichen Wert speichert (das foo-Attribut bezieht sich auf das zugehörige Modell). Wenn Sie values() aufrufen und Feldnamen übergeben, können Sie entweder foo oder foo_id übergeben und Sie erhalten dasselbe zurück (der Wörterbuchschlüssel stimmt mit dem Feldnamen überein, den Sie übergeben haben).

Sie müssen die Felder als values('character_link__field1', 'character_link__field2'...) Argumente aufzulisten ... oder einfach nur benutzen Sie es nicht und Prozess ORM-Objekte, dass die Daten in einer Abfrage abgerufen verwenden.

Mit Tools wie django-debug-toolbar können Sie Ihre Anforderungen überprüfen, um sicherzustellen, dass beim Rendern der Vorlage nur eine SQL-Abfrage durchgeführt wird.

Verwandte Themen