首页 文章

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

提问于
浏览
0

在我的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 回答

  • 1

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


    附:它对我有用 .

相关问题