Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django Formset:如何消除对is_valid()和save()的额外查询?_Django - Fatal编程技术网

Django Formset:如何消除对is_valid()和save()的额外查询?

Django Formset:如何消除对is_valid()和save()的额外查询?,django,Django,我正在发回一个表单集。Django调试工具栏向我显示,对于is_valid()和save(),queryset中的每个模型都将被重新查询,即使它们在构建表单集期间都已从数据库中检索到。这里没有特殊的对象关联 例如,一个用户有5个域。这将发出1+5+5查询==11个查询。如何消除最后10个查询 版本: Python 2.7.5 Django 1.6.1 models.py class Domain(Model): name = models.CharField(unique=True,

我正在发回一个表单集。Django调试工具栏向我显示,对于is_valid()和save(),queryset中的每个模型都将被重新查询,即使它们在构建表单集期间都已从数据库中检索到。这里没有特殊的对象关联

例如,一个用户有5个域。这将发出1+5+5查询==11个查询。如何消除最后10个查询

版本:

  • Python 2.7.5
  • Django 1.6.1
models.py

class Domain(Model):
    name = models.CharField(unique=True, max_length=255)
    user = models.ForeignKey(User)

    class Meta:
        db_table = 'domain'
forms.py

class DomainForm(ModelForm):
    class Meta:
        model = Domain

DomainFormSet = modelformset_factory(Domain, form=DomainForm, extra=0)

class DomainFormSetWithQuerySet(DomainFormSet):
    def __init__(self, user, data=None):
        super(DomainFormSetWithQuerySet, self).__init__(data, prefix='domains', queryset=Domain.objects.filter(user=user))
views.py

def view(request):
    if request.method == 'POST':

        domain_formset = DomainFormSetWithQuerySet(request.user, request.POST)

        // One big select query:
        // select * from domains where user_id = ? order by id asc
        //
        // Then, an additional select query for each form in the formset:
        // select * from domains where domain_id = ?
        if domain_formset.is_valid():

            // An additional select query for each form in the formset:
            // select * from domains where domain_id = ?
            domain_formset.save()