python - Django select_lated 查询不会将所有值返回到模板

标签 python django django-orm django-1.10

我有 2 个模型。来 self 正在闲逛的 django 网站的角色和角色详细信息。

CharactersDetails 与字符有外键关系

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

在我看来,我正在这样做:

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

在我的模板中,我仅从 CharactersDetails 表中获取字段。

在manage.py shell中,我运行了相同的查询,发现它实际上从CharactersDetails和Characters返回字段(这就是我想要的),但是当 View 获取上下文对象时,它只显示来自的项目CharactersDetails 表。

(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
>>> 

我采用相同的查询并将其粘贴到manage.py dbshel​​l中:

(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

我得到了所有字段。但模板不会传递最后 6 个值。当我将 .values() 添加到查询集的末尾然后执行以下操作时,我可以看到这一点:

{{ character_info }}

在模板中我看到:

<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}]>

我是否做错了什么,或者是否有一种特殊的方式我应该从模板中调用这些值?

感谢您的阅读。

最佳答案

查询集方法.values()不会隐式添加所选外键的属性。这是一个extract of the documentation :

A few subtleties that are worth mentioning:

  • If you have a field called foo that is a ForeignKey, the default values() call will return a dictionary key called foo_id, since this is the name of the hidden model attribute that stores the actual value (the foo attribute refers to the related model). When you are calling values() and passing in field names, you can pass in either foo or foo_id and you will get back the same thing (the dictionary key will match the field name you passed in).

您需要将字段列为 values('character_link__field1', 'character_link__field2'...) 参数...或者只是不使用它并处理 ORM 对象,这将使用在一次查询中检索的数据。

使用 django-debug-toolbar 等工具,您可以检查您的请求,以确保在渲染模板时仅进行一个 SQL 查询。

关于python - Django select_lated 查询不会将所有值返回到模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42980477/

相关文章:

python - Django选项没有属性_name_map

Python 模块和对象名称冲突

python - "site"不是一个包

python - 如何禁用 Nose 测试的覆盖率报告

python - 如何在 Django 模型上定义任何一年的月份范围?

django - 在 Django 中执行 PostgreSql 查询

python - 处理 pandas 中值的包装

python - 在numpy中的两个数组中查找一对元素的位置

python - Django 查询多对多子集包含

python - 在 Django 模型字段中设置默认值的更好方法