Skip to content

Commit d67f163

Browse files
committed
docs update merge
1 parent 1750a31 commit d67f163

File tree

6 files changed

+58
-65
lines changed

6 files changed

+58
-65
lines changed

rest_framework_mongoengine/fields.py

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -82,15 +82,6 @@ def run_validators(self, value):
8282
super(DocumentField, self).run_validators(value)
8383

8484

85-
class AttributedDocumentField(DocumentField):
86-
""" DocumentField that gets attribute value in ``to_representation``.
87-
88-
Used internally.
89-
"""
90-
def get_attribute(self, instance):
91-
return serializers.Field.get_attribute(self, instance)
92-
93-
9485
class GenericEmbeddedField(serializers.Field):
9586
""" Field for generic embedded documents.
9687
@@ -132,9 +123,11 @@ class GenericField(serializers.Field):
132123
133124
Recursively traverses lists and dicts.
134125
Primitive values are serialized using ``django.utils.encoding.smart_text`` (keeping json-safe intact).
135-
Embedded documents handled using GenericEmbeddedField.
126+
Embedded documents handled using temporary GenericEmbeddedField.
127+
128+
No validation performed.
136129
137-
TODO: catch objectids and dbrefs.
130+
Note: it will not work properly if a value contains some complex elements.
138131
"""
139132
embedded_doc_field = GenericEmbeddedField
140133

@@ -170,6 +163,11 @@ def parse_data(self, data):
170163
return data
171164

172165

166+
class AttributedDocumentField(DocumentField):
167+
def get_attribute(self, instance):
168+
return serializers.Field.get_attribute(self, instance)
169+
170+
173171
class GenericEmbeddedDocumentField(GenericEmbeddedField, AttributedDocumentField):
174172
""" Field for GenericEmbeddedDocumentField.
175173
@@ -189,9 +187,13 @@ class DynamicField(GenericField, AttributedDocumentField):
189187
class ReferenceField(serializers.Field):
190188
""" Field for References.
191189
190+
Should be specified with ``model`` or ``queryset`` argument pointing to referenced model.
191+
192192
Internal value: DBRef.
193193
194-
Representation: ``str(id)``, or ``{ _id: str(id) }``.
194+
Representation: ``str(id)``, or ``{ _id: str(id) }`` (for compatibility with GenericReference).
195+
196+
Validation checks existance of referenced object.
195197
"""
196198
default_error_messages = {
197199
'invalid_input': _('Invalid input. Expected `str` or `{ _id: str }`.'),
@@ -203,11 +205,13 @@ class ReferenceField(serializers.Field):
203205
pk_field_class = ObjectIdField
204206
""" Serializer field class used to handle object ids. Override it in derived class if you have other type of ids."""
205207

206-
def __init__(self, model=None, **kwargs):
208+
def __init__(self, model=None, queryset=None, **kwargs):
207209
if model is not None:
208210
self.queryset = model.objects
211+
elif queryset is not None:
212+
self.queryset = queryset
209213
else:
210-
self.queryset = kwargs.pop('queryset', self.queryset)
214+
self.queryset = None
211215

212216
self.pk_field = self.pk_field_class()
213217

@@ -284,17 +288,19 @@ class GenericReferenceField(serializers.Field):
284288
Internal value: Document, retrieved with only id field. The mongengine does not support DBRef here.
285289
286290
Representation: ``{ _cls: str, _id: str }``.
291+
292+
Validation checks existance of given class and existance of referenced model.
287293
"""
288294

289295
pk_field_class = ObjectIdField
290-
""" Serializer field class used to handle object ids """
296+
""" Serializer field class used to handle object ids. Override it in derived class if you have other type of ids."""
291297

292298
default_error_messages = {
293299
'not_a_dict': serializers.DictField.default_error_messages['not_a_dict'],
294300
'missing_items': _('Expected a dict with `_cls` and `_id` items.'),
295301
'invalid_id': _('Cannot parse "{pk_value}" as {pk_type}.'),
296302
'undefined_model': _('Document `{doc_cls}` has not been defined.'),
297-
'unmapped_colection': _('Cannot find Document for collection "{collection}".'),
303+
'undefined_collecion': _('No document defined for collection `{collection}`.'),
298304
'not_found': _('Document with id={pk_value} does not exist.'),
299305
}
300306

@@ -315,7 +321,7 @@ def to_internal_value(self, value):
315321
doc_name = value['_cls']
316322
doc_id = value['_id']
317323
except KeyError:
318-
self.fail('missing_class')
324+
self.fail('missing_items')
319325
try:
320326
doc_cls = get_document(doc_name)
321327
except NotRegistered:
@@ -342,7 +348,7 @@ def to_representation(self, value):
342348
doc_collection = value.collection
343349
class_match = [ k for k,v in _document_registry.items() if v._get_collection_name() == doc_collection ]
344350
if len(class_match) != 1:
345-
self.fail('undefined_model', collection=doc_collection)
351+
self.fail('unmapped_collection', collection=doc_collection)
346352
doc_cls = class_match[0]
347353
return { '_cls': doc_cls, '_id': self.pk_field.to_representation(doc_id) }
348354

@@ -363,6 +369,8 @@ class GeoPointField(MongoValidatingField, serializers.Field):
363369
""" Field for 2D point values.
364370
365371
Internal value and representation: ``[ x, y ]``
372+
373+
Validation is delegated to mongoengine field.
366374
"""
367375
default_error_messages = {
368376
'not_a_list': _("Points must be a list of coordinates, instead got {input_value}."),
@@ -389,11 +397,13 @@ def to_representation(self, value):
389397
class GeoJSONField(MongoValidatingField, serializers.Field):
390398
""" Field for GeoJSON values.
391399
400+
Shouldbe specified with argument ``geo_type`` referencing to GeoJSON geometry type ('Point', 'LineSting', etc)
401+
392402
Internal value: ``[ coordinates ]`` (as required by mongoengine fields).
393403
394404
Representation: ``{ 'type': str, 'coordinates': [ coords ] }`` (GeoJSON geometry format).
395405
396-
Validation: delegated to mongoengine.
406+
Validation: delegated to corresponding mongoengine field.
397407
"""
398408

399409
default_error_messages = {
@@ -409,7 +419,7 @@ class GeoJSONField(MongoValidatingField, serializers.Field):
409419
'MultiPolygon': me_fields.MultiPolygonField
410420
}
411421

412-
def __init__(self, geo_type=None, *args, **kwargs):
422+
def __init__(self, geo_type, *args, **kwargs):
413423
assert geo_type in self.valid_geo_types
414424
self.mongo_field = self.valid_geo_types[geo_type]
415425
super(GeoJSONField, self).__init__(*args, **kwargs)

rest_framework_mongoengine/generics.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,3 @@
1-
"""
2-
Adaptation of DRF generics.
3-
4-
You should use them instead of original DRF classes.
5-
"""
6-
71
from rest_framework import mixins
82
from rest_framework import generics as drf_generics
93

rest_framework_mongoengine/routers.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,3 @@
1-
"""
2-
Adaptaion of DRF routers.
3-
4-
You should use them instead of original DRF classes.
5-
"""
6-
71
from rest_framework import routers as drf_routers
82

93

rest_framework_mongoengine/serializers.py

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -95,29 +95,27 @@ def raise_errors_on_nested_writes(method_name, serializer, validated_data):
9595
class DocumentSerializer(serializers.ModelSerializer):
9696
""" Serializer for Documents.
9797
98-
Replacement of DRF ModelSerializer, with almost the same API and features.
99-
100-
Regocnized primitve fields:
101-
102-
``StringField``
103-
``URLField``
104-
``EmailField``
105-
``IntField``
106-
``LongField``
107-
``FloatField``
108-
``DecimalField``
109-
``BooleanField``
110-
``DateTimeField``
111-
``ComplexDateTimeField``
112-
``ObjectIdField``
113-
``SequenceField`` (assumes it has integer counter)
114-
``UUIDField``
115-
``GeoPointField``
116-
``GeoJsonBaseField`` (all those fields)
117-
118-
Compound fields: ``ListField`` and ``DictField`` mapped to corresponding DRF fields, with respect to nested field specification.
119-
120-
The ``ReferenceField`` is handled like ``ForeignKey`` in DRF: there nestted serializer autogenerated if serializer depth greater then 0, otherwise it's handled by it's own (results as ``str(id)``.
98+
Recognized primitve fields:
99+
100+
* ``StringField``
101+
* ``URLField``
102+
* ``EmailField``
103+
* ``IntField``
104+
* ``LongField``
105+
* ``FloatField``
106+
* ``DecimalField``
107+
* ``BooleanField``
108+
* ``DateTimeField``
109+
* ``ComplexDateTimeField``
110+
* ``ObjectIdField``
111+
* ``SequenceField`` (assumes it has integer counter)
112+
* ``UUIDField``
113+
* ``GeoPointField``
114+
* ``GeoJsonBaseField`` (all those fields)
115+
116+
Compound fields: ``ListField`` and ``DictField`` are mapped to corresponding DRF fields, with respect to nested field specification.
117+
118+
The ``ReferenceField`` is handled like ``ForeignKey`` in DRF: there nested serializer autogenerated if serializer depth greater then 0, otherwise it's handled by it's own (results as ``str(id)``).
121119
122120
For ``EmbeddedDocumentField`` also nested serializer autogenerated for non-zero depth, otherwise it is skipped. TODO: THIS IS PROBABLY WRONG AND SHOULD BE FIXED.
123121
@@ -488,7 +486,10 @@ def __repr__(self):
488486

489487

490488
class EmbeddedDocumentSerializer(DocumentSerializer):
491-
""" Serializer for EmbeddedDocuments. """
489+
""" Serializer for EmbeddedDocuments.
490+
491+
Skips id field and uniqueness validation.
492+
"""
492493

493494
def get_default_field_names(self, declared_fields, model_info):
494495
# skip id field
@@ -512,7 +513,7 @@ def to_internal_value(self, data):
512513
class DynamicDocumentSerializer(DocumentSerializer):
513514
""" Serializer for DynamicDocuments.
514515
515-
Maps all undefined fields to ``DynamicField``.
516+
Maps all undefined fields to :class:`fields.DynamicField`.
516517
"""
517518
def to_representation(self, instance):
518519
ret = super(DynamicDocumentSerializer,self).to_representation(instance)

rest_framework_mongoengine/validators.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def exclude_current_instance(self, queryset):
1717
class UniqueValidator(MongoValidatorMixin, validators.UniqueValidator):
1818
""" Replacement of DRF UniqueValidator.
1919
20-
Used by ``DocumentSerializer`` for fields, present in unique indexes.
20+
Used by :class:`DocumentSerializer` for fields, present in unique indexes.
2121
"""
2222
def __call__(self, value):
2323
queryset = self.queryset
@@ -36,7 +36,7 @@ def __repr__(self):
3636
class UniqueTogetherValidator(MongoValidatorMixin, validators.UniqueTogetherValidator):
3737
""" Replacement of DRF UniqueTogetherValidator.
3838
39-
Used by ``DocumentSerializer`` for fields, present in unique indexes.
39+
Used by :class:`DocumentSerializer` for fields, present in unique indexes.
4040
"""
4141
def __call__(self, attrs):
4242
self.enforce_required_fields(attrs)

rest_framework_mongoengine/viewsets.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,3 @@
1-
"""
2-
Adaptation of DRF viewsets.
3-
4-
You should use them instead of original DRF classes.
5-
"""
6-
71
from rest_framework import mixins
82
from rest_framework.viewsets import ViewSetMixin
93
from rest_framework_mongoengine.generics import GenericAPIView

0 commit comments

Comments
 (0)