<p>当然,您有多种选择来解决问题,但为了快速解决问题,我将为您提供最简单的解决方案:</p>
<p>实际上,您可以为帖子添加注释,这样您就可以在每篇帖子中使用作者用户名:</p>
<pre class="lang-py prettyprint-override"><code>from django.db.models import F
Post.objects.annotate(formatted_author=F('author__username')).values('id', 'formatted_author')
</code></pre>
<p>通过这种方式,您可以获得撰写文章的作者的用户名。但是,要小心,如果您在某些帖子的作者字段中有一些<strong>null</strong>值,您将在响应中得到<strong>None</strong>值</p>
<hr/>
<p>但是,如果使用<strong>Postgres</strong>作为数据库,则可以使用<strong>Postgres</strong>的内置<strong>ArrayField</strong>功能,并通过以下方式使注释更加优雅:</p>
<pre class="lang-py prettyprint-override"><code>from django.db.models.expressions import Func
from django.db.models import F, Value, TextField
from django.contrib.postgres.fields import ArrayField
formatted_author = F('author__username')
formatted_tags = Func(
F('tags'),
Value(","),
function='regexp_split_to_array', output=ArrayField(TextField())
)
Post.objects \
.annotate(formatted_author=formatted_author, formatted_tags=formatted_tags) \
.values('id', 'formatted_author', 'formatted_tags')
</code></pre>
<p>通过这种方式,您还可以节省在以前进行的每次迭代中进行SQL查询的成本</p>
<hr/>
<h2>更新1</h2>
<p>如果您没有Postgres数据库,那么我很抱歉地告诉您,您仍然需要在python代码中处理标记,并且我为您当前的实现提供了一些更好的重构。那么你现在拥有的是:</p>
<pre class="lang-py prettyprint-override"><code>splited_tags = [v['tags'].split(',') for v in someposts]
for n, i in enumerate(someposts):
someposts[n]['tags'] = splited_tags[n]
</code></pre>
<p>我的建议是:</p>
<pre class="lang-py prettyprint-override"><code>someposts = list(map(lambda somepost: dict(formatted_tags=somepost['tags'].split(','), **somepost), someposts))
</code></pre>
<p>正如您所看到的,它只需要一次迭代,只需要一个新的属性权衡,但这只是我的建议</p>
<hr/>
<h2>更新2</h2>
<p>正如帖子所有者在评论中询问的<code>post.author.profile.user.first_name</code>和<code>post.author.profile.image.url</code>属性,我想对此进行详细说明</p>
<p>通常,您无法检索这些属性,因为您没有在<code>.values()</code>函数中显式选择它们<code>.values()</code>将仅检索选定的属性。因此,基本上您可以再次使用注释创建<code>F</code>变量(用于名称长度减少):</p>
<pre class="lang-py prettyprint-override"><code>from django.db.models import F
Post.objects.annotate(formatted_author=F('author__username'), formatted_first_name=F('author__profile__user__first_name'), formatted_image=F('author__profile__image')).values('id', 'formatted_author', 'formatted_first_name', 'formatted_image')
</code></pre>
<p>正如我的直觉告诉我的,实际上<code>post.author.first_name</code>等同于<code>post.author.profile.user.first_name</code>,但是如果你有一个不同的模型结构,我可能错了</p>