在我的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
字段是一个下拉列表,允许用户选择所需的符号。
这一切都正常,但问题是正在为表单集中的每个表单查询数据库以检索symbol
的列表。例如,如果用户有10个位置,那么每个位置都会有一个符号下拉列表...这会导致单独的数据库查询以检索所有符号。
如何对所有可用的symbol
执行一次查询,并将其用于formset中每个表单的下拉列表?
答案 0 :(得分:1)
我认为你应该在prefetch_related中指向模型Position的所有字段,这些字段具有到另一个模型的链接,在你的情况下你必须添加字段用户:
PositionFormSet(queryset=user.position_set.all().prefetch_related('symbol', 'user'))
。
P.S。它对我有用。