DRF library to operate resource's properties as a dictionary
Project description
drf-madprops
DRF library of helpers to operate on lists of resource properties as dicts
Written and used by the folks at Yola to support our free website builder.
Overview
It's a typical case for relational DBs when some table (e.g. User) is extended via subordinate key-value table (e.g. UserPreference). This allows to dynamically add/delete fields to User (stored in UserPreference). Usually those property models have very simple structures, e.g:
class UserPreference(models.Model):
id = models.AutoField()
user = models.ForeignKey(User, related_name='preferences')
name = models.CharField()
value = models.CharField)
But it's not very convenient to expose/operate on them via standard DRF serializers. We'll get something like:
[
{"id": "id1", "user": "user1", "name": "property1", "value": "value1"},
{"id": "id2", "user": "user1", "name": "property2", "value": "value2"}
...
]
This library contains two base classes for property's serializers (for cases when properties are exposed as separate resource and as nested resource) which allows to retrieve/operate on parent resource properties as dicts. For example, instead of representation listed above, we'll get something like:
{
"property1": "value1",
"property2": "value2",
...
}
Usage
Additional meta options
read_only_props
: list of property names, which values cannot be changed via serializer.json_props
: list of property names, which values are stored as JSON. Serializer willjson.loads()
those values when converting to representation and willjson.dumps()
them before saving.
As a nested serializer
from madprops.serializers import NestedPropertySerializer, PropertiesOwnerSerializer
class PreferenceSerializer(NestedPropertySerializer):
class Meta:
model = Preference
read_only_props = ('user_token', 'tutorial_email_sent')
json_props = ('packages',)
class UserSerializer(PropertiesOwnerSerializer):
preferences = PreferenceSerializer(many=True, required=False)
As a serializer used for properties endpoint
from madprops.serializers import PropertySerializer
class PreferenceSerializer(PropertySerializer):
class Meta:
model = Preference
read_only_props = ('user_token', 'tutorial_email_sent')
class PreferencePrivateViewSet(ModelViewSet):
serializer_class = PreferenceSerializer
paginate_by = None
Testing
Run the tests with:
tox
Or install development requirements and run tests with:
pip install -r requirements.txt
pytest tests
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file drf-madprops-1.1.0.tar.gz
.
File metadata
- Download URL: drf-madprops-1.1.0.tar.gz
- Upload date:
- Size: 6.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.18.4 setuptools/39.0.1 requests-toolbelt/0.8.0 tqdm/4.19.5 CPython/3.6.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 89af47236e6109a9b68bc236c1fc2daf6d225955d903f379c32331fcb995a29a |
|
MD5 | 92de1688a55e33866563ee8fc1e34b2d |
|
BLAKE2b-256 | 1a7b67089d2673f6c65eb74a21a4dff690fec60a5fe11db50ec74571668418bf |