#30000: Passing QuerySet constructed with .union() causes
ModelMultipleChoiceField
to return wrong values
-----------------------------------------+------------------------
Reporter: thoha | Owner: nobody
Type: Uncategorized | Status: new
Component: Forms | Version: 1.11
Severity: Normal | Keywords:
Triage Stage: Unreviewed | Has patch: 0
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
-----------------------------------------+------------------------
I have a form that displays large lists of selectable records using
ModelMultipleChoiceFields. These fields need to show a predetermined list
of records, obtained through some database queries performed within the
Form's class __init__ block.
The QuerySet required is constructed by reaching through a few ForeignKey
relationships to retrieve the required records and then using the .union()
method to assemble the QuerySet.
e.g.:
{{{
# Retrieve original record:
base = BaseModel.objects.filter(source_name=source_name).first()
# Get related record via ForeignKey relationship:
related_record = base.related_record
# related_record.other_related_things has ManyToMany relationship to
another Model (one or more records).
# So get them:
other_related_things = related_record.other_related_things.all()
# Loop through these:
union_queryset = None
for other_related_thing in other_related_things:
# Each other_related_thing has a set of SelectableRecords associated
with it, via a ForeignKey relationship from the latter model to the former
one. This gets that QuerySet:
other_related_thing_queryset =
other_related_thing.selectablerecords_set.all()
# Build union_queryset:
if union_queryset is None:
union_queryset = other_related_thing_queryset
else:
union_queryset =
union_queryset_object.union(other_related_thing_queryset)
# The resulting union_queryset is a unified queryset containing
all of the required fields.
# If only one other_related_thing exists, the result of evaluating
the union_queryset QuerySet ought to be the
# same as the result of evaluating SelectableRecords.objects.all()
}}}
However, when I pass the union_queryset to my ModelMultipleChoiceFields,
**validating the form returns all of the records contained in
union_queryset instead of the records selected on the form**. The form
displays correctly.
The code used for this is:
{{{
self.fields['selectable_records'] =
forms.ModelMultipleChoiceField(queryset=union_queryset, required=False,
label='Selectable
records',
widget=forms.CheckboxSelectMultiple)
}}}
Do take note that the documentation for the .union() method
([https://docs.djangoproject.com/en/2.1/ref/models/querysets/#union here])
indicates there are some limits to the QuerySet returned, and I assume my
problem has to do with this.
--
Ticket URL: <https://code.djangoproject.com/ticket/30000>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/048.0b0857e9de474f9e80a409459afe10b5%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.