对formset中的每个表单重复查询

时间:2016-06-30 13:07:48

标签: python django

在我的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中每个表单的下拉列表?

1 个答案:

答案 0 :(得分:1)

我认为你应该在prefetch_related中指向模型Position的所有字段,这些字段具有到另一个模型的链接,在你的情况下你必须添加字段用户: PositionFormSet(queryset=user.position_set.all().prefetch_related('symbol', 'user'))

P.S。它对我有用。