在我的django应用程序中,我有可以拥有多个职位的用户 . ie:Position模型具有User模型的外键 . 通过使用django modelformset_factory
输出与当前登录用户关联的所有位置,如下所示:
Views.py:
class ABCUpdate(View):
def get(self, request):
user = request.user
PositionFormSet = modelformset_factory(Position)
formset = PositionFormSet(queryset=user.position_set.all().prefetch_related('symbol'))
return render(request,
'some_template.html',
{'formset': formset})
some_template.html
<form action="#" method="post">
{% csrf_token %}
{{ formset.management_form }}
{% for position in formset %}
<div class="row">
{{ position }}
</div>
{% endfor %}
<button type="submit">
Update
</button>
</form>
位置模型:
class Position(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL)
symbol = models.OneToOneField(Symbol)
# more fields...
some_template.html
上的一个字段是 symbol
字段(即:我在上面的代码段中使用 prefetch_related
的字段) . Symbol
来自使用外键的其他模型 . 这意味着在html模板上, symbol
字段是一个下拉列表,允许用户选择所需的符号 .
这一切都正常,但问题是正在为formset中的每个表单查询数据库以检索 symbol
的列表 . 例如,如果用户有10个位置,那么每个位置将有一个符号下拉列表...这导致单独的数据库查询以检索所有符号 .
我如何只针对所有可用的 symbol
进行一次查询,并将其用于formset中每个表单的下拉列表?
1 回答
我认为你应该在prefetch_related中指向模型Position的所有字段,这些字段具有到另一个模型的链接,在你的情况下你必须添加字段用户:
PositionFormSet(queryset=user.position_set.all().prefetch_related('symbol', 'user'))
.附:它对我有用 .