23 | | == Changes introduced on the branch == |
| 25 | == New features == |
| 26 | |
| 27 | Along with, and as part of, all the bug fixes mentioned above there are a number of new features in the branch. A number of these features are purely internal details, but there are a few that add extra public functionality. |
| 28 | |
| 29 | 1. Ordering querysets across related models has a new syntax that is the same as the way you specify relations in a filter: {{{field1__field2__field3}}}, etc. The new syntax is more natural and consistent, as well as helping solve a few bugs. See the {{{order_by()}}} documentation in db-api.txt for more information and some examples. |
| 30 | 2. Model inheritance is now possible. Both abstract base classes and multi-table inheritance are possible. See the model-api.txt documentation for details. |
| 31 | 3. The {{{__iter__()}}} method on querysets does not pull all the results into memory immediately. This reduces memory usage for large querysets where you don't end up accessing all the results. Queryset caching still occurs, though, so a single queryset object will only hit the database once. This change means that testing the boolean value of a queryset will only pull in the first few rows of the result, not all of them. |
| 32 | 4. Slicing a queryset from a particular value to the end of a queryset is possible. |
| 33 | 5. Querysets have a {{{reverse()}}} method that reverses whatever the current ordering is. |
| 34 | 6. The queryset {{{values()}}} method can retrieve fields that are related via a {{{ForeignKey}}} or {{{OneToOneField}}} relation. |
| 35 | 7. A new {{{valueslist()}}} method has been added to querysets. This is similar to {{{values()}}} except that it returns a list of tuples, rather than a list of dictionaries. |
| 36 | 8. You can specify a list of related fields to traverse in a {{{select_related()}}} call. This provides a way to select only the related data you are interested in. Only single-valued relations can be selected in this way, however (not {{{ManyToManyFields}}}). |
| 37 | 9. Filtering a queryset by checking if a field attribute is {{{None}}} is equivalent to testing if the corresponding database column is {{{NULL}}}. So {{{qs.filter(foo=None)}}} is now identical to {{{qs.filter(foo__isnull=True)}}}. |
| 38 | 10. An {{{update()}}} method has been added to querysets to allow multiple objects to have an attribute updated in a single SQL query. |
| 39 | |
| 40 | == Backwards incompatible changes == |
| 46 | * The {{{OneToOneField}}} class has finally been updated, as the documentation has indicated would be happening for a long while. There are few externally visible changes, with one exception: a {{{OneToOneField}}} is no longer automatically the primary key for a model that includes it. It still accepts the {{{primary_key}}} attribute, however, so you should add {{{primary_key=True}}} to the declaration of any existing {{{OneToOneField}}} instances in your code to preserve backwards compatibility. |
| 47 | * If you pass a bad field name into a filter, Django now raises {{{FieldError}}} (from {{{django.core.exceptions}}}), rather than Python's built in {{{TypeError}}}. Also, the list of legal field names is now sorted alphabetically for easier searching. This should have no effect on most production code, however some test suites may need to be updated to accommodate the changed traceback output. |
| 48 | |
| 49 | == Work in progress == |
| 50 | |
| 51 | If you are testing this branch, there are a few areas that need caution. These are known places that are work-in-progress, so expecting them to work perfectly (or even at all) would be optimistic. Obviously, in addition to these points there are a lot of little things being tweaked and fixed, as well as optimisation work going on. That's to be expected on a branch. |
| 52 | |
| 53 | * Model inheritance has not been integrated into the admin. It's unclear at this time whether it will be worth doing this for existing admin or just port straight to newforms-admin. In any case, trying to use multi-table inheritance via the admin interface won't work. |
| 54 | * {{{OneToOneField}}} in the admin interface has similar problems. |
| 55 | * {{{select_related()}}} with inherited models has not yet been integrated. |
| 56 | * The Oracle backend has not been ported yet. This won't be particularly difficult, but it's still work to be done. Justin Bronn has started the ball rolling with a patch in #6161 that will be used as the base. |
| 57 | * {{{exclude()}}} handling for particularly twisted filter combinations is still being bullet-proofed. It should work in almost all cases, but check the results carefully at the moment if you're doing something complex. |