Re: [Django] #34262: Queryset grouped by annotation with aggregates on another annotated expression crashes on MySQL with sql_mode=only_full_group_by.

2024-02-28 Thread Django
#34262: Queryset grouped by annotation with aggregates on another annotated
expression crashes on MySQL with sql_mode=only_full_group_by.
-+-
 Reporter:  Mariusz Felisiak |Owner:  (none)
 Type:  Bug  |   Status:  new
Component:  Database layer   |  Version:  4.1
  (models, ORM)  |
 Severity:  Normal   |   Resolution:
 Keywords:  mysql| Triage Stage:  Accepted
  only_full_group_by |
Has patch:  0|  Needs documentation:  0
  Needs tests:  0|  Patch needs improvement:  0
Easy pickings:  0|UI/UX:  0
-+-
Comment (by Simon Charette):

 [https://modern-sql.com/caniuse/any_value A recent article on any_value
 and functional dependency] if it can be of help to anyone working on this
 issue.
-- 
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 view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/0107018df274a5db-40c8c659-8179-4362-8b17-dfaa7540a259-00%40eu-central-1.amazonses.com.


Re: [Django] #34262: Queryset grouped by annotation with aggregates on another annotated expression crashes on MySQL with sql_mode=only_full_group_by.

2023-11-28 Thread Django
#34262: Queryset grouped by annotation with aggregates on another annotated
expression crashes on MySQL with sql_mode=only_full_group_by.
-+-
 Reporter:  Mariusz Felisiak |Owner:  (none)
 Type:  Bug  |   Status:  new
Component:  Database layer   |  Version:  4.1
  (models, ORM)  |
 Severity:  Normal   |   Resolution:
 Keywords:  mysql| Triage Stage:  Accepted
  only_full_group_by |
Has patch:  0|  Needs documentation:  0
  Needs tests:  0|  Patch needs improvement:  0
Easy pickings:  0|UI/UX:  0
-+-

Comment (by Simon Charette):

 FWIW this relates to #34992 where we had to disable
 `allows_group_by_selected_pks` on MariaDB entirely as it doesn't implement
 any form of functional dependence resolition.

-- 
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 view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/0107018c16c9cd5f-48d3d006-a26a-44a0-82e9-eba26c8af697-00%40eu-central-1.amazonses.com.


Re: [Django] #34262: Queryset grouped by annotation with aggregates on another annotated expression crashes on MySQL with sql_mode=only_full_group_by.

2023-11-27 Thread Django
#34262: Queryset grouped by annotation with aggregates on another annotated
expression crashes on MySQL with sql_mode=only_full_group_by.
-+-
 Reporter:  Mariusz Felisiak |Owner:  (none)
 Type:  Bug  |   Status:  new
Component:  Database layer   |  Version:  4.1
  (models, ORM)  |
 Severity:  Normal   |   Resolution:
 Keywords:  mysql| Triage Stage:  Accepted
  only_full_group_by |
Has patch:  0|  Needs documentation:  0
  Needs tests:  0|  Patch needs improvement:  0
Easy pickings:  0|UI/UX:  0
-+-
Changes (by Jonny Park):

 * owner:  Jonny Park => (none)
 * status:  assigned => new


-- 
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 view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/0107018c14e4c520-b3f1d46a-dd0f-4347-aa93-0c5191930978-00%40eu-central-1.amazonses.com.


Re: [Django] #34262: Queryset grouped by annotation with aggregates on another annotated expression crashes on MySQL with sql_mode=only_full_group_by.

2023-08-12 Thread Django
#34262: Queryset grouped by annotation with aggregates on another annotated
expression crashes on MySQL with sql_mode=only_full_group_by.
-+-
 Reporter:  Mariusz Felisiak |Owner:  Jonny
 |  Park
 Type:  Bug  |   Status:  assigned
Component:  Database layer   |  Version:  4.1
  (models, ORM)  |
 Severity:  Normal   |   Resolution:
 Keywords:  mysql| Triage Stage:  Accepted
  only_full_group_by |
Has patch:  0|  Needs documentation:  0
  Needs tests:  0|  Patch needs improvement:  0
Easy pickings:  0|UI/UX:  0
-+-

Comment (by Jonny Park):

 I think @David Wobrock's query is easier to implement and covers more
 cases.

 For example, if we have a followinfg queryset:

 {{{
 books_qs = (
 Book.objects.annotate(greatest_pages=Greatest("pages",
 Value(600)))
 .values(
 "greatest_pages",
 )
 .annotate(
 min_pages=Min("pages"),
 least=Least("min_pages", "greatest_pages"),
 )
 )
 }}}

 Creating the following query that @David Wobrock presented seems like more
 sense to me and covers many other cases.

 {{{
 SELECT greatest_pages,
MIN(pages),
LEAST(MIN(pages), greatest_pages) AS least
 FROM (SELECT GREATEST(pages, 600) greatest_pages,
  pages
   FROM aggregation_book2) AS t
 GROUP BY greatest_pages
 ORDER BY NULL;
 }}}

 If we were to take @Simon Charette's query, it could be like this:

 {{{
 SELECT geatest_pages, min_pages, LEAST(min_pages, greatest_pages) AS
 `least` FROM (
   SELECT
 GREATEST(`aggregation_book`.`pages`, 600) greatest_pages,
 MIN(`aggregation_book`.`pages`) min_pages
   FROM `aggregation_book`
   GROUP BY 1 ORDER BY NULL
 ) masked
 }}}

 I think the position of "MIN(`aggregation_book`.`pages`) min_pages" look
 award for me.
 with `.values_list("least", flat=True)` clause present, there was a
 obvious reason for "MIN(`aggregation_book`.`pages`) min_pages" to be
 pushed down because it is a dependency for `least`, but without
 `.values_list("least", flat=True)` it loses it's reason to be pushed down.
 I am a bit suspicious that choosing which additional item to be pushed
 down by looking at `values_list` worth it's effort considering frequency
 of this use case is thought to be small.

-- 
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 view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/01070189e90415e0-a1db624c-a83a-42dc-a16c-a5eb45239933-00%40eu-central-1.amazonses.com.


Re: [Django] #34262: Queryset grouped by annotation with aggregates on another annotated expression crashes on MySQL with sql_mode=only_full_group_by.

2023-07-24 Thread Django
#34262: Queryset grouped by annotation with aggregates on another annotated
expression crashes on MySQL with sql_mode=only_full_group_by.
-+-
 Reporter:  Mariusz Felisiak |Owner:  Jonny
 |  Park
 Type:  Bug  |   Status:  assigned
Component:  Database layer   |  Version:  4.1
  (models, ORM)  |
 Severity:  Normal   |   Resolution:
 Keywords:  mysql| Triage Stage:  Accepted
  only_full_group_by |
Has patch:  0|  Needs documentation:  0
  Needs tests:  0|  Patch needs improvement:  0
Easy pickings:  0|UI/UX:  0
-+-
Changes (by Jonny Park):

 * owner:  nobody => Jonny Park
 * status:  new => assigned


-- 
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 view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/0107018986b1af44-a3476e0a-1b2d-4ef3-a7b2-8b3340c3046e-00%40eu-central-1.amazonses.com.


Re: [Django] #34262: Queryset grouped by annotation with aggregates on another annotated expression crashes on MySQL with sql_mode=only_full_group_by.

2023-07-14 Thread Django
#34262: Queryset grouped by annotation with aggregates on another annotated
expression crashes on MySQL with sql_mode=only_full_group_by.
-+-
 Reporter:  Mariusz Felisiak |Owner:  nobody
 Type:  Bug  |   Status:  new
Component:  Database layer   |  Version:  4.1
  (models, ORM)  |
 Severity:  Normal   |   Resolution:
 Keywords:  mysql| Triage Stage:  Accepted
  only_full_group_by |
Has patch:  0|  Needs documentation:  0
  Needs tests:  0|  Patch needs improvement:  0
Easy pickings:  0|UI/UX:  0
-+-

Comment (by Mariusz Felisiak):

 Replying to [comment:5 Amir Karimi]:
 > I'm curios to know what happened with this issue. Any updates?

 Feel-free to work on this issue. Please don't leave comments like `any
 updates?` they don't help and cause unnecessary noise to the history.

-- 
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 view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/0107018955274555-b7a5b882-a5da-4ddc-9515-a2c29e585aa6-00%40eu-central-1.amazonses.com.


Re: [Django] #34262: Queryset grouped by annotation with aggregates on another annotated expression crashes on MySQL with sql_mode=only_full_group_by.

2023-07-14 Thread Django
#34262: Queryset grouped by annotation with aggregates on another annotated
expression crashes on MySQL with sql_mode=only_full_group_by.
-+-
 Reporter:  Mariusz Felisiak |Owner:  nobody
 Type:  Bug  |   Status:  new
Component:  Database layer   |  Version:  4.1
  (models, ORM)  |
 Severity:  Normal   |   Resolution:
 Keywords:  mysql| Triage Stage:  Accepted
  only_full_group_by |
Has patch:  0|  Needs documentation:  0
  Needs tests:  0|  Patch needs improvement:  0
Easy pickings:  0|UI/UX:  0
-+-

Comment (by Amir Karimi):

 Replying to [comment:4 Simon Charette]:
 > Thanks for the analysis David, option 1. and 2. were also the conclusion
 of [https://github.com/django/django/pull/16460#discussion_r1071497499 my
 limited investigation on the subject] so it's great to have cross peer
 validation on the subject.
 >
 > I think there might be a way to implement 3. by reusing
 
[https://github.com/django/django/blob/d3c93cdc597e0efc2815111c04dd5a427432ed37/django/db/models/sql/compiler.py#L669-L680
 some of the logic used to implement masking of columns when filtering
 against window functions] which requires two level of subquery wrapping.
 >
 > A different of approaching 3. is to think that any form of ''masking''
 of annotations/aliases used for grouping purposes would result in a
 subquery pushdown. So to reuse your example, instead of performing a
 subquery pushdown to compute expressions used with aggregate queries we'd
 do it the other way around to have MySQL group against top level `SELECT`
 expressions which it's good at inferring dependencies from
 >
 > {{{#!sql
 > SELECT LEAST(min_pages, greatest_pages) AS `least` FROM (
 >   SELECT
 > GREATEST(`aggregation_book`.`pages`, 600) greatest_pages,
 > MIN(`aggregation_book`.`pages`) min_pages
 >   FROM `aggregation_book`
 >   GROUP BY 1 ORDER BY NULL
 > ) masked
 > }}}
 >
 > This should reduce the area of impact of this change to aggregating
 queries that group against a value that isn't explicitly selected and
 would also happen to solve the last remaining known issue with using
 server-side parameters binding for Postgres (#34255).

 I'm curios to know what happened with this issue. Any updates?

-- 
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 view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/0107018954ec968d-d02aff38-0f76-49df-a6fd-987e1495873d-00%40eu-central-1.amazonses.com.


Re: [Django] #34262: Queryset grouped by annotation with aggregates on another annotated expression crashes on MySQL with sql_mode=only_full_group_by.

2023-01-24 Thread Django
#34262: Queryset grouped by annotation with aggregates on another annotated
expression crashes on MySQL with sql_mode=only_full_group_by.
-+-
 Reporter:  Mariusz Felisiak |Owner:  nobody
 Type:  Bug  |   Status:  new
Component:  Database layer   |  Version:  4.1
  (models, ORM)  |
 Severity:  Normal   |   Resolution:
 Keywords:  mysql| Triage Stage:  Accepted
  only_full_group_by |
Has patch:  0|  Needs documentation:  0
  Needs tests:  0|  Patch needs improvement:  0
Easy pickings:  0|UI/UX:  0
-+-

Comment (by Simon Charette):

 Thanks for the analysis David, option 1. and 2. were also the conclusion
 of [https://github.com/django/django/pull/16460#discussion_r1071497499 my
 limited investigation on the subject] so it's great to have cross peer
 validation on the subject.

 I think there might be a way to implement 3. by reusing
 
[https://github.com/django/django/blob/d3c93cdc597e0efc2815111c04dd5a427432ed37/django/db/models/sql/compiler.py#L669-L680
 some of the logic used to implement masking of columns when filtering
 against window functions] which requires two level of subquery wrapping.

 A different of approaching 3. is to think that any form of ''masking'' of
 annotations/aliases used for grouping purposes would result in a subquery
 pushdown. So to reuse your example, instead of performing a subquery
 pushdown to compute expressions used with aggregate queries we'd do it the
 other way around to have MySQL group against top level `SELECT`
 expressions which it's good at inferring dependencies from

 {{{#!sql
 SELECT LEAST(min_pages, greatest_pages) AS `least` FROM (
   SELECT
 GREATEST(`aggregation_book`.`pages`, 600) greatest_pages,
 MIN(`aggregation_book`.`pages`) min_pages
   FROM `aggregation_book`
   GROUP BY 1 ORDER BY NULL
 ) masked
 }}}

 This should reduce the area of impact of this change to aggregating
 queries that group against a value that isn't explicitly selected and
 would also happen to solve the last remaining known issue with using
 server-side parameters binding for Postgres (#34255).

-- 
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 view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/01070185e5d97508-22287621-7837-444e-ac2a-ce7250818748-00%40eu-central-1.amazonses.com.


Re: [Django] #34262: Queryset grouped by annotation with aggregates on another annotated expression crashes on MySQL with sql_mode=only_full_group_by.

2023-01-24 Thread Django
#34262: Queryset grouped by annotation with aggregates on another annotated
expression crashes on MySQL with sql_mode=only_full_group_by.
-+-
 Reporter:  Mariusz Felisiak |Owner:  nobody
 Type:  Bug  |   Status:  new
Component:  Database layer   |  Version:  4.1
  (models, ORM)  |
 Severity:  Normal   |   Resolution:
 Keywords:  mysql| Triage Stage:  Accepted
  only_full_group_by |
Has patch:  0|  Needs documentation:  0
  Needs tests:  0|  Patch needs improvement:  0
Easy pickings:  0|UI/UX:  0
-+-
Changes (by David Wobrock):

 * cc: David Wobrock (added)


Comment:

 Hey there,

 Took a look at what is happening and why MySQL is failing with
 `ONLY_FULL_GROUP_BY`.

 In short and simplified, this statement works:
 {{{
 mysql> SELECT GREATEST(pages, 600), MIN(pages) FROM aggregation_book GROUP
 BY GREATEST(pages, 600) ORDER BY NULL;
 +--++
 | GREATEST(pages, 600) | MIN(pages) |
 +--++
 |  600 |300 |
 | 1132 |   1132 |
 |  946 |946 |
 +--++
 3 rows in set (0,01 sec)
 }}}

 And when you try to add a third expression, that uses the two first:
 {{{
 mysql> SELECT GREATEST(pages, 600), MIN(pages), LEAST(MIN(pages),
 GREATEST(pages, 600)) AS least FROM aggregation_book GROUP BY
 GREATEST(pages, 600) ORDER BY NULL;
 ERROR 1055 (42000): Expression #3 of SELECT list is not in GROUP BY clause
 and contains nonaggregated column
 'test_django_tests.aggregation_book2.pages' which is not functionally
 dependent on columns in GROUP BY clause; this is incompatible with
 sql_mode=only_full_group_by
 }}}
 MySQL is not happy, even though it seems rather straightforward that this
 query should work.

 The resources I could find on the topic are here:
 - [https://bugs.mysql.com/bug.php?id=90792 A ticket from the MySQL bug
 tracker]
 - [https://stackoverflow.com/q/49447622 A related StackOverflow thread]
 - [https://dev.mysql.com/blog-archive/when-only_full_group_by-wont-see-
 the-query-is-deterministic/ A MySQL blog post]

 And the blog post explains in more depth why it's not working.

 ---

 That leaves us with a choice to make for Django's behavior I reckon :)
 Some options:

 == 1. Add an `ANY_VALUE` around the problematic expression

 That solves the issue here for instance:
 {{{
 mysql> SELECT GREATEST(pages, 600), MIN(pages),
 ANY_VALUE(LEAST(MIN(pages), GREATEST(pages, 600))) AS least FROM
 aggregation_book2 GROUP BY GREATEST(pages, 600) ORDER BY NULL;
 +--++---+
 | GREATEST(pages, 600) | MIN(pages) | least |
 +--++---+
 |  600 |300 |   300 |
 | 1132 |   1132 |  1132 |
 |  946 |946 |   946 |
 +--++---+
 3 rows in set (0,00 sec)
 }}}
 However, I fear that detecting when to wrap the expression with an
 `ANY_VALUE` is a rabbit hole we don't want to go down, as we might end up
 implementing what the MySQL team didn't want to implement.


 == 2. Raise awareness

 We could, firstly, document the potential issue, and secondly raise a
 warning when such an error occurs when executing a query a Django.
 That way, users are at least aware that's not entirely their or Django's
 fault.


 == 3. Generally change query generation

 Another type of workaround suggested by the [https://dev.mysql.com/blog-
 archive/when-only_full_group_by-wont-see-the-query-is-deterministic/ MySQL
 blog post] is to use a subquery/derived table:
 {{{
 mysql> SELECT greatest_pages,
MIN(pages),
LEAST(MIN(pages), greatest_pages) AS least
 FROM (SELECT GREATEST(pages, 600) greatest_pages,
  pages
   FROM aggregation_book2) AS t
 GROUP BY greatest_pages
 ORDER BY NULL;
 +++---+
 | greatest_pages | MIN(pages) | least |
 +++---+
 |600 |300 |   300 |
 |   1132 |   1132 |  1132 |
 |946 |946 |   946 |
 +++---+
 3 rows in set (0,00 sec)
 }}}
 So that we always try to group on a column, and not an expression.
 Even though, it might be worse in terms of performances, depending the DB
 implementation I guess.

 This change would then affect all databases I reckon, which is a much
 larger change, and therefore riskier.


 == 4. Any other option! :D



 I hope all of this makes sense, happy to read any thoughts on 

Re: [Django] #34262: Queryset grouped by annotation with aggregates on another annotated expression crashes on MySQL with sql_mode=only_full_group_by.

2023-01-16 Thread Django
#34262: Queryset grouped by annotation with aggregates on another annotated
expression crashes on MySQL with sql_mode=only_full_group_by.
-+-
 Reporter:  Mariusz Felisiak |Owner:  nobody
 Type:  Bug  |   Status:  new
Component:  Database layer   |  Version:  4.1
  (models, ORM)  |
 Severity:  Normal   |   Resolution:
 Keywords:  mysql| Triage Stage:  Accepted
  only_full_group_by |
Has patch:  0|  Needs documentation:  0
  Needs tests:  0|  Patch needs improvement:  0
Easy pickings:  0|UI/UX:  0
-+-
Changes (by Carlton Gibson):

 * stage:  Unreviewed => Accepted


-- 
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 view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/01070185bea07c1e-500b88dd-854a-4ec1-bf8c-64053f7c1faa-00%40eu-central-1.amazonses.com.


Re: [Django] #34262: Queryset grouped by annotation with aggregates on another annotated expression crashes on MySQL with sql_mode=only_full_group_by.

2023-01-16 Thread Django
#34262: Queryset grouped by annotation with aggregates on another annotated
expression crashes on MySQL with sql_mode=only_full_group_by.
-+-
 Reporter:  Mariusz Felisiak |Owner:  nobody
 Type:  Bug  |   Status:  new
Component:  Database layer   |  Version:  4.1
  (models, ORM)  |
 Severity:  Normal   |   Resolution:
 Keywords:  mysql| Triage Stage:
  only_full_group_by |  Unreviewed
Has patch:  0|  Needs documentation:  0
  Needs tests:  0|  Patch needs improvement:  0
Easy pickings:  0|UI/UX:  0
-+-
Changes (by Mariusz Felisiak):

 * cc: Simon Charette (added)


-- 
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 view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/01070185be198419-ec881e90-0944-4d3b-a782-d81eaa51b3db-00%40eu-central-1.amazonses.com.


[Django] #34262: Queryset grouped by annotation with aggregates on another annotated expression crashes on MySQL with sql_mode=only_full_group_by.

2023-01-16 Thread Django
#34262: Queryset grouped by annotation with aggregates on another annotated
expression crashes on MySQL with sql_mode=only_full_group_by.
-+-
   Reporter:  Mariusz|  Owner:  nobody
  Felisiak   |
   Type:  Bug| Status:  new
  Component:  Database   |Version:  4.1
  layer (models, ORM)|   Keywords:  mysql
   Severity:  Normal |  only_full_group_by
   Triage Stage: |  Has patch:  0
  Unreviewed |
Needs documentation:  0  |Needs tests:  0
Patch needs improvement:  0  |  Easy pickings:  0
  UI/UX:  0  |
-+-
 Queryset grouped by annotation with aggregates on another annotated
 expression crashed on MySQL with `sql_mode=only_full_group_by`, e.g.
 {{{#!python
 def test_group_by_nested_expression_with_params(self):
 books_qs = (
 Book.objects.annotate(greatest_pages=Greatest("pages",
 Value(600)))
 .values(
 "greatest_pages",
 )
 .annotate(
 min_pages=Min("pages"),
 least=Least("min_pages", "greatest_pages"),
 )
 .values_list("least", flat=True)
 )
 self.assertCountEqual(books_qs, [300, 946, 1132])
 }}}
 crashes with:
 {{{
 django.db.utils.OperationalError: (1055, "Expression #1 of SELECT list is
 not in GROUP BY clause and contains nonaggregated column
 'test_django_2.aggregation_book.pages' which is not functionally dependent
 on columns in GROUP BY clause; this is incompatible with
 sql_mode=only_full_group_by")
 }}}

-- 
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 view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/01070185bbda77ce-a7da31f2-7290-4ef8-b068-b8f2c154a170-00%40eu-central-1.amazonses.com.