wq.db 2.0 alpha
wq.db 2.0 alpha is a preview of the next version of wq.db, as part of the wq 2.0 alpha release. This major release includes a number of breaking changes, including the complete removal of the wq.db.patterns
module in favor of a simpler API for nested models.
Changes by @sheppard except where noted.
New APIs
@register
decorator
wq.db.rest now provides a top-level @register
decorator that directly mimics the Django admin’s @register
. It is useful for creating and directly registering a custom Serializer classes:
from wq.db import rest
from .models import MyModel
@rest.register(MyModel, url="customurl")
class MyCustomSerializer(rest.ModelSerializer)
class Meta:
wq_field_config = {...}
In addition, rest.router.register()
now accepts a model as the first argument, making it more like admin.site.register()
. If the first argument is a model it will call rest.router.register_model()
, otherwise it will defer to Django REST Framework’s DefaultRouter.register()
as before.
These changes were introduced in f93c4d8
.
Streamlined Registration for Nested Models
The wq.db.patterns
module previously provided a number of extended serializers to facilitate registering models as “attachments” under a primary parent model. This API worked well enough but was cumbersome to use. The extended serializers (and the wq.db.patterns
module itself) have been removed in favor of a simpler API that is built into the default ModelSerializer.
from wq.db import rest
from .models import ParentModel, ChildModel
rest.router.register(
ParentModel,
nested_arrays=[ChildModel],
fields="__all__",
)
The nested_arrays
argument will automatically create a nested serializer attribute on the serializer for ParentModel.
If you need to customize the nested serializer, you can do so in one of three ways:
- Register the child model with the router as a separate top-level API with an explicit serializer. wq.app will automatically handle translating child records between ORM models and forms for the parent and child APIs.
- Register just the child serializer with
rest.router.register_serializer(ChildModel, ChildSerializer)
- Explicilty define a
ChildSeriizer
attribute on a customParentSerializer
. This is more or less how it was done before, but now both serializers can just extendwq.db.rest.ModelSerializer
rather than the separated serializers fromwq.db.patterns
.
from wq.db import rest
from .models import ParentModel, ChildModel
class ChildSerializer(rest.ModelSerializer):
class Meta:
model = ChildModel
@rest.register(ParentModel)
class ParentSerializer(rest.ModelSerializer):
children = ChildSerializer(
many=True,
wq_config={
"initial": {
"type_field": "type",
},
},
)
This change was introduced in f93c4d8
and by updating wq.db’s default ModelSerializer
to extend two base classes:
NaturalKeyModelSerializer
from django-natural-keysWritableNestedModelSerializer
from drf-writable-nested
Enhancements & Fixes
- Compatibilty with Django REST Framework 3.14 (#84 by @ydf)
- Simplify user-specific config JSON to only include permissions (wq/wq#54)
- Improve foreign key support (
02e889e
,9155e5b
)- Report related_name in the wq config object for use by the client ORM
- Detect DRF’s
SlugRelatedField
in addition to wq.db’sLookupRelatedField
when mapping foreign key columns.
- Reduce extraneous database queries
- Remove
ContentType
proxy class in favor of additional router methods (9155e5b
) - Remove automatic label generation for foreign keys (
9155e5b
) - Leverage
PKOnlyObject
optimization if the ForeignKey’sto_field
is the same as the slug value. (9155e5b
) - If
cache="filter"
orcache="autoupdate"
is specified without an explicitcache_filter
, return an empty response instead of the entire table (8cc1e0c
)
- Remove
- Improve fieldset configuration and JSON parsing (
5da66b1
,4e97e1b
,b5c5e7d
,aab0284
) - Don’t create URL routes for configurations registered with
external=True
(7898de4
) - Clean up code style and project layout (
969798b
,9499bb6
)
Removed Functionality
Several modules and functions have been removed. Most of these only remained for backwards compatibility with projects built with wq 1.2 and earlier versions.
- Removed
ModelSerializer.add_lookups()
and other support for Mustache templates (7556674
,02e889e
)- Removed
wq.db.rest.context_processors
- Removed
wq.db.rest.auth.context_processors
- Removed
- Removed
wq.db.default_settings
(02e889e
).- Take a look at wq django template 2.0 alpha to see what are settings are still relevant to wq-powered projects.
- Removed
wq.db.patterns.identify
and the rest ofwq.db.patterns
(02e889e
,f93c4d8
)- Use the streamlined API above instead.
- Removed compatibility with Django 1.x-style
include()
(02e889e
)- If for some reason you are still calling
path('', include(rest.router.urls))
, change this to justpath('', rest.router.urls)
.
- If for some reason you are still calling
- Removed
wq.db.rest.model_tools
,wq.db.rest.models.ContentType
, andwq.db.rest.migrations
(9155e5b
) - Removed automatic
[fkname]_label
serializer fields (9155e5b
).- Use
fkname_label = serializers.ReadOnlyField(source='fkname.__str__')
if you were relying on this functionality.
- Use