【问题标题】:Django duplicate database lookups with inlineformsetDjango 使用 inlineformset 重复数据库查找
【发布时间】:2019-06-14 07:12:45
【问题描述】:

我需要帮助解决有关内联表单集中每个表单的重复数据库查询的问题。我有一个页面,用户可以在其中添加和编辑属于作者的书籍。

models.py

from django.db import models
class Author(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100)

class Book(models.Model):
    id = models.AutoField(primary_key=True)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    title = models.CharField(max_length=100)
    category_idcategory = models.ForeignKey(Category, models.DO_NOTHING)

class Category(models.Model):
    name = models.CharField(max_length=100)

forms.py

from django import forms
class BookForm(forms.ModelForm):
    class Meta:
        model = Book
        fields = '__all__'

views.py

instance = get_object_or_404(Author, id=id)
form = inlineformset_factory(Author, Book, form=BookForm, can_delete=True, extra=5)
formset = form(request.POST or None, instance=instance)

if request.method == "POST":
    if formset.is_valid():
        instanceForm = formset.save(commit=False)
        for obj in instanceForm:
            obj.save()
        for obj in formset.deleted_objects:
            obj.delete()
        return HttpResponseRedirect(URL)

当我运行模板时,它会对表单集中的每个表单的类别模型执行数据库查询。如何防止这些重复?我不知道将 select_related 或 prefetch_related 放在哪里。如果 Book 模型的实例增长到大量,页面加载时间会变得很慢。

模板.html

<table class="table table-sm">
{{ formset.management_form }}
    <thead>
        <td>Title</td>
        <td>Category</td>
        <td>delete</td>
    </thead>
    <tbody>
    {% for obj in formset %}
    {{ obj.id }}
        <tr>
            <td>{{ obj.title }}</td>
            <td>{{ obj.category_idcategory }}</td>
            <td>{{ obj.DELETE }}</td>
       </tr>
    {% endfor %}
    </tbody>
</table>

【问题讨论】:

  • 你好,可以发一下模板代码吗?
  • 在原帖中添加了模板代码

标签: python django database duplicates


【解决方案1】:

您可以像这样更改表单集的查询集:

class InlineBookFormSet(BaseInlineFormSet):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # Here is where to put the select_related.
        self.queryset = Book.objects.select_related('category_idcategory').all()

然后在你的工厂方法调用中:

# Use your custom InlineBookFormSet
form = inlineformset_factory(Author, Book, form=BookForm, can_delete=True, extra=5, formset=InlineBookFormSet)

【讨论】:

  • 我无法让它工作,它一直在为表单集中的每个表单查询数据库
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-12
  • 1970-01-01
  • 1970-01-01
  • 2010-11-02
  • 2012-09-18
  • 2020-06-22
相关资源
最近更新 更多