<commit_before>## HEAD

### Breaking changes

The `_filter_field` method now returns a `Q()` object, not a queryset.
Similarly, the `_filter_relation` method no longer accepts a queryset
and now returns a new namedtuple called `FilterDescription`, which
contains a `Q()` object property called `filter` and a boolean called
`need_distinct` which indicated if the master query should be made
distinct.

Using `Q()` objects instead of querysets allows making queries in
`with_ids` without requiring a subquery on filtered relations, which
can be a big performance win on large tables.

### Features
- Added a new `unupdatable_fields` property to views which lists
  fields which can be written on creation of an object only and are
  ignored on updates (#135).

## Version 1.4.0

### Features
- Add `Router.bootstrap()`function, which automatically imports all `views` directories of all the registered apps in django. Also, it automatically registers the default ModelView of binder.
  
  Old:
  
	```python
	from binder.router import Router
	from binder.views import ModelView
	
	# needed for binder.router to work
	import cyrm.views  # noqa
	import base.orders.views  # noqa
	import ib.ib_orders.views  # noqa
	....
	import base.planning.views # noqa
	
	router = Router().register(ModelView)
	
	api_urls = [
		re_path('^', include(router.urls)),
	]
	
	```
	
	New:
	```python
	from binder.router import Router
	router = Router.bootstrap()<commit_msg>Update CHANGELOG to mention OneToOneField remote id reference (#117)<commit_after>## HEAD

### Breaking changes

The `_filter_field` method now returns a `Q()` object, not a queryset.
Similarly, the `_filter_relation` method no longer accepts a queryset
and now returns a new namedtuple called `FilterDescription`, which
contains a `Q()` object property called `filter` and a boolean called
`need_distinct` which indicated if the master query should be made
distinct.

Using `Q()` objects instead of querysets allows making queries in
`with_ids` without requiring a subquery on filtered relations, which
can be a big performance win on large tables.

### Features
- Added a new `unupdatable_fields` property to views which lists
  fields which can be written on creation of an object only and are
  ignored on updates (#135).
- It is now possible to POST or PUT an id for the "remote" end of a
  OneToOneField (#117).

## Version 1.4.0

### Features
- Add `Router.bootstrap()`function, which automatically imports all `views` directories of all the registered apps in django. Also, it automatically registers the default ModelView of binder.
  
  Old:
  
	```python
	from binder.router import Router
	from binder.views import ModelView
	
	# needed for binder.router to work
	import cyrm.views  # noqa
	import base.orders.views  # noqa
	import ib.ib_orders.views  # noqa
	....
	import base.planning.views # noqa
	
	router = Router().register(ModelView)
	
	api_urls = [
		re_path('^', include(router.urls)),
	]
	
	```
	
	New:
	```python
	from binder.router import Router
	router = Router.bootstrap()
{'fraction_non_alphanumeric': 0.08336068263866098, 'fraction_numerical': 0.00590744995077125, 'mean_word_length': 4.273356401384083, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4570981', 'n_tokens_mistral': 918, 'n_tokens_neox': 853, 'n_words': 379}