#22787: natural key serialization
--------------------------------------+--------------------
     Reporter:  jian                  |      Owner:  jian
         Type:  New feature           |     Status:  new
    Component:  Core (Serialization)  |    Version:  master
     Severity:  Normal                |   Keywords:
 Triage Stage:  Unreviewed            |  Has patch:  1
Easy pickings:  0                     |      UI/UX:  0
--------------------------------------+--------------------
 In order to use natural key serialization, the user has to define
 `model.natural_key` and `manager.get_by_natural_key` methods for every
 single model to be serialized. This is tedious and requires many LOC if
 the user wants to serialize multiple models, especially if those models do
 not already have custom manager classes.

 To remedy this, the linked pull request defines a base class
 implementation of `model.natural_key` and `manager.get_by_natural_key`.
 This implementation automatically produces natural keys that uniquely
 identify each model without recourse to the `pk` field, and the results
 are qualitatively similar to what the user would have defined in custom
 methods.

 In the rare instance where the model lacks any uniqueness constraints,
 this approach would not work, and invoking `natural_key` or
 `get_by_natural_key` would raise a `NotImplementedError`. In such a
 scenario, it is not clear that even a user-defined natural key would work
 (but, as always, the user is free to implement one anyway).

 Currently, if the user requests a natural key serialization, Django
 introspects the model using `hasattr(model, 'natural_key')` and silently
 falls back to standard serialization if a natural key serialization is not
 available. Using `hasattr` is no longer possible with the new
 implementation, so this pull request removes these checks, and Django will
 instead complain with an informative message such as `CommandError: Unable
 to serialize database: The Question class must provide a natural_key()
 method`. This might be a backward-incompatible change, but it is the
 correct one. When a natural key serialization is requested but
 unavailable, the correct behavior is for Django to complain loudly rather
 than being silent ("explicit is better than implicit").

 The pull request includes a new regression test, and passes all tests
 using SQLite version 3.7.13.

 django-developers discussion: https://groups.google.com/d/msg/django-
 developers/6ZboknjrSkg/vOQXDSDhG28J

-- 
Ticket URL: <https://code.djangoproject.com/ticket/22787>
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/047.4455e40fd12dfaa41ee7481918dd09f8%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to