#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 django-updates+unsubscr...@googlegroups.com.
To post to this group, send email to django-updates@googlegroups.com.
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.

Reply via email to