Version 3.0

**The 3.0 release notes are [available here](https://github.com/tomchristie/django-rest-framework/blob/version-3.0/docs/topics/3.0-announcement.md).**

Discussion group thread on 3.0 changes... https://groups.google.com/forum/#!topic/django-rest-framework/24rSIFWEJoI

To do:

- [x] Basic serializers as forms
- [x] `unique`, `unique_together`.
- [x] `.validate()` method on fields.
- [x] `FileField` and `ImageField`.
- [x] `ListField` vs `ListSerializer`.
- [x] BaseSerializer to accept `many`, `partial`, `context`.
- [x] `request.data` and `request.query_params`.
- [x] Automatic field binding.
- [x] `many=True` on relational fields.
- [x] Comprehensive tests for serializer fields & serializers.
- [x] Integration tests for serializer relationships
- [x] Support `extra_kwargs`.
- [x] `NotImplementedError` by default on field to/from methods.
- [x] Consider `to_representation()` and `to_internal_value()` renaming.
- [x] `MethodField` back to `SerializerMethodField`, support *optional* method argument.
- [x] Ensure `NON_FIELD_ERRORS` get a consistent key name in responses.
- [x] BooleanField to validate more strictly. (See #1866.)
- [x] through fields as read-only.
- [x] Nice manager representations on serializer repr.
- [x] Drop `label` keyword argument when its default would be correct.
- [x] `lookup_class` to raise KeyError, and `ModelField.field_mapping` to include `models.Field: ModelField` mapping.
- [x] Compact JSON representation.
- [x] Unicode JSON representation with control character escaping.
- [x] Remove custom throttle header.
- [x] Use Django's GCBV latest `.all() behavior instead of `._clone()`, [here](https://github.com/tomchristie/django-rest-framework/blob/version-3.0/rest_framework/generics.py#L217).
- [x] Document `DecimalField` - required args, and `coerce_to_string` behaviour.
- [x] Consider default settings for datetime repr - coerce to string at serializer level by default?
- [x] Drop usage of `validators.EMPTY_VALUES` 
- [x] Correct class on nested `ModelSerializer` vs `HyperlinkedModelSerializer`

---

Second pass:

- [ ] Serializers as forms cleanup.
- [ ] List serializers as forms.
- [ ] Model field validators should be preserved.
- [ ] Validators on relational fields.
- [ ] Style of validation errors inside `ListField`, `ManyRelation`, `ListSerializer`.
- [ ] `test_lists.py` from core serializers.
- [ ] tests for dotted source notation.
- [ ] Blank date returns incorrect validation error.
- [ ] Form buttons in browsable API.
- [ ] ListSerializer and keyword arguments design decision, see... https://groups.google.com/d/msg/django-rest-framework/24rSIFWEJoI/ziZ8zzEOAa4J
- [x] Nested serializers as forms.
- [x] `unique_for_date`.
- [x] ~~`source=<field_name>` and `method_name=get_<field_name>` -> PendingDeprecation, not assert.~~
- [x] Call any simple callables when getting attribute value... https://groups.google.com/forum/#!topic/django-rest-framework/24rSIFWEJoI
- [x] Reintroduce save hooks.
- [x] PendingDeprecation instead of outright changes.
- [x] Consider `transform_<field>()`.
- [x] `validate` returning value or not?
- [x] Integration tests for serializer reverse relationships.
- [x] tests for Generic FKs.
- [x] Consider error lists vs single error.
- [x] `min_value`, `max_value` on integer fields. (See also [django-12030](https://code.djangoproject.com/ticket/12030), and [associated PR](https://github.com/django/django/commit/1506c71a95cd7f58fbc6363edf2ef742c58d2487).)
- [x] None-list passed to `ManyRelation` or `ListSerializer`.
- [x] `empty` / `initial` on fields and empty serializer data.
- [x] Deal with `datetime` being passed to `TimeField` or `DateField`.
- [x] Don't include validator kwargs on read only fields.
- [x] `NullBooleanField`.
- [x] OPTIONS and the `metadata()` API.
- [x] `partial` support.
- [x] allow_none, allow_blank & required vs default behaviours.

---

Documentation:

- [x] Update the tutorial.
- [x] The metadata API.
- [x] Validators. 
- [ ] Update `DateTimeField`/`DateField`/`TimeField` now that format default has changed.
- [x] PUT as create, including missing link to docs for PUT-as-create, [here](https://github.com/tomchristie/django-rest-framework/blob/version-3.0/rest_framework/mixins.py#L88) when they exist.
- [ ] `NullBooleanField`
- [ ] `ListField`/`ListSerializer`
- [ ] Document `min_value`/`max_value` on integer type fields, as per https://github.com/django/django/commit/1506c71a95cd7f58fbc6363edf2ef742c58d2487
- [ ] Remove `widget` and document `style`.

---

Nice to haves:

- [ ] Better docs on custom exception handling in release notes.
- [ ] dotted and starred source on relational fields (get_attribute and get_iterable)
- [ ] Nested choices.
- [x] Validators defined on `Meta`
- [x] Errors on serializer forms.
- [ ] Errors as sorted dicts.
- [ ] files support on serializer forms for compat with Django GCBV and Vanilla.
- [ ] `ValidationFailed` to use `errors`, not `detail`?
- [ ] Performance on hyperlinked fields.
- [x] Performance on PK fields.
- [x] Support `ReadOnlyField` automatically based on `fields` attribute.
- [x] Error when `source` == `field_name`.
- [x] Error when `SerializerMethodField` argument is == `get_{field_name}`
- [x] Nice error messages when `fields` includes something that is not a field, reverse relationship or simple model method.

---

Later:

- [ ] More explicit error when SerializerMethodField raises AttributeError
- [ ] Improve attribute error when field not found on instance during serialisation.
- [x] Improve errors when default `.create()` or `.update()` methods are not sufficient.
- [ ] Improve error when nested field is missing `many=True`.
- [ ] Cache model info for `ModelSerializer` / `HyperlinkedModelSerializer`.
- [ ] `initial` as `0`/`0.0`/`'0'` for JSON integer fields, but blank string in form.
- [ ] Push related ObjectDoesNotExist into related field logic and out of field? (Or not?)
- [ ] Choices in HTML defaulting correctly.
- [ ] NavBar in browsable API a bit too high.
- [ ] Description in browsable API doesn't leave a bottom margin, unless  Markdown rendered.
- [ ] `unique_for_date` and `source` argument.
- [ ] `unique_for_date` on relationships.

---
Closes #1263.
Closes #1358.
Closes #1368.
Closes #1521.
Closes #1773.
Closes #1774.
Closes #1775.
Closes #1799.
Closes #1801.
Closes #1802.
Closes #1823.
Closes #1848.
Closes #1889.