Re: [Django] #30000: Passing QuerySet constructed with .union() causes ModelMultipleChoiceField to return wrong values

2018-11-30 Thread Django
#3: Passing QuerySet constructed with .union() causes 
ModelMultipleChoiceField
to return wrong values
-+-
 Reporter:  thoha|Owner:  nobody
 Type:  Bug  |   Status:  new
Component:  Forms|  Version:  1.11
 Severity:  Normal   |   Resolution:
 Keywords:  queryset, union, | Triage Stage:
  forms  |  Unreviewed
Has patch:  0|  Needs documentation:  0
  Needs tests:  0|  Patch needs improvement:  0
Easy pickings:  0|UI/UX:  0
-+-
Changes (by thoha):

 * type:  Uncategorized => Bug


-- 
Ticket URL: 
Django 
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/063.b4d833bdd409e8976a0107cf0721dc86%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.


Re: [Django] #30000: Passing QuerySet constructed with .union() causes ModelMultipleChoiceField to return wrong values

2018-11-30 Thread Django
#3: 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   |   Resolution:
 Keywords:  queryset, union, | Triage Stage:
  forms  |  Unreviewed
Has patch:  0|  Needs documentation:  0
  Needs tests:  0|  Patch needs improvement:  0
Easy pickings:  0|UI/UX:  0
-+-

Comment (by thoha):

 After some further testing it appears the unexpected behaviour comes from
 the fact that UNION querysets cannot be filtered, which the
 ModelMultipleChoiceField apparently does out of sight. Still, I believe
 that the observed behaviour is undesired, and the field should either
 accept the union queryset and work properly, or raise an exception if a
 union queryset is passed.

 I also found that using

 {{{
 union_queryset =
 
SelectableRecords.objects.filter(other_related_thing_name__in=other_related_things)
 }}}

 instead of the for-loop results in a queryset that actually works properly
 with the ModelMultipleChoiceField. Based on
 [https://stackoverflow.com/questions/50638442/django-queryset-union-
 return-broken-queryset-filter-and-get-return-every this StackOverflow
 question].

-- 
Ticket URL: 
Django 
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/063.f9e6fa2fbc30e72932f955d8ff27f494%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.


Re: [Django] #30000: Passing QuerySet constructed with .union() causes ModelMultipleChoiceField to return wrong values

2018-11-30 Thread Django
#3: 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   |   Resolution:
 Keywords:  queryset, union, | Triage Stage:
  forms  |  Unreviewed
Has patch:  0|  Needs documentation:  0
  Needs tests:  0|  Patch needs improvement:  0
Easy pickings:  0|UI/UX:  0
-+-
Changes (by thoha):

 * keywords:   => queryset, union, forms


-- 
Ticket URL: 
Django 
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/063.6d975e168ba406b6a4c134913cba6600%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.


Re: [Django] #30000: Passing QuerySet constructed with .union() causes ModelMultipleChoiceField to return wrong values

2018-11-30 Thread Django
#3: 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 |   Resolution:
 Keywords: | Triage Stage:  Unreviewed
Has patch:  0  |  Needs documentation:  0
  Needs tests:  0  |  Patch needs improvement:  0
Easy pickings:  0  |UI/UX:  0
---+--
Description changed by thoha:

Old description:

> 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.

New description:

 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 Selecta