Note that there are some explanatory texts on larger screens.

plurals
  1. PODjango SELECT (1) AS [a] FROM [my_table] WHERE ([my_table].[id] = ? AND NOT ([my_table].[id] = ? )) (1, 1)
    primarykey
    data
    text
    <p>Why is Django executing statements such as this:</p> <pre><code>SELECT (1) AS [a] FROM [my_table] WHERE ([my_table].[id] = ? AND NOT ([my_table].[id] = ? )) (1, 1) </code></pre> <p>This happens when calling is_valid() on a formset created the following way:</p> <pre><code>MyFormSet = modelformset_factory(Table, fields=['my_field'], extra=0) my_form_set = MyFormSet(request.POST, queryset=Table.objects.all()) </code></pre> <p>where Table and MyForm are as simple as, say:</p> <pre><code>class Table(models.Model): my_field = models.CharField(max_length=10) class MyForm(forms.ModelForm): class Meta: model = Table </code></pre> <p>Hint: I looked at the call stack and the code responsible for it (in django/forms/models.py) is below:</p> <pre><code>def _perform_unique_checks(self, unique_checks): import pdb; pdb.set_trace() bad_fields = set() form_errors = [] for unique_check in unique_checks: # Try to look up an existing object with the same values as this # object's values for all the unique field. lookup_kwargs = {} for field_name in unique_check: lookup_value = self.cleaned_data[field_name] # ModelChoiceField will return an object instance rather than # a raw primary key value, so convert it to a pk value before # using it in a lookup. if isinstance(self.fields[field_name], ModelChoiceField): lookup_value = lookup_value.pk lookup_kwargs[str(field_name)] = lookup_value qs = self.instance.__class__._default_manager.filter(**lookup_kwargs) # Exclude the current object from the query if we are editing an # instance (as opposed to creating a new one) if self.instance.pk is not None: qs = qs.exclude(pk=self.instance.pk) </code></pre> <p>Basically the pk is both included for the uniqueness check and excluded. Looks like Django can be smarter and avoid such inefficiency.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload