Example #1
0
def nested_update(instance, key, value, objects=None):
    objects = objects or []
    nested = getattr(instance, key, None)

    def fix(x):
        s = str(x).lower()
        if s == "true":
            return "True"
        if s == "false":
            return "False"
        return x

    value = {k: fix(v) for k, v in value.items()}
    if not nested:
        # object does not exist, try to create it
        try:
            field = get_model_field(instance, key)
            related_model = get_related_model(field)
        except:
            raise exceptions.ValidationError('Invalid relationship: %s' % key)
        else:
            nested = related_model.objects.create(**value)
            setattr(instance, key, nested)
    else:
        # object exists, perform a nested update
        for k, v in six.iteritems(value):
            if isinstance(v, dict):
                nested_update(nested, k, v, objects)
            else:
                setattr(nested, k, v)
        objects.append(nested)
    return objects
Example #2
0
    def _build_implicit_prefetches(
        self,
        model,
        prefetches,
        requirements
    ):
        """Build a prefetch dictionary based on internal requirements."""

        for source, remainder in six.iteritems(requirements):
            if not remainder or isinstance(remainder, six.string_types):
                # no further requirements to prefetch
                continue

            related_field = get_model_field(model, source)
            related_model = get_related_model(related_field)

            queryset = self._build_implicit_queryset(
                related_model,
                remainder
            ) if related_model else None

            prefetches[source] = self._create_prefetch(
                source,
                queryset
            )

        return prefetches
Example #3
0
    def serializer_class(self):
        """Get the class of the child serializer.

        Resolves string imports.
        """
        serializer_class = self._serializer_class
        if serializer_class is None:
            from dynamic_rest.routers import DynamicRouter
            serializer_class = DynamicRouter.get_canonical_serializer(
                None, model=get_related_model(self.model_field))

        if not isinstance(serializer_class, six.string_types):
            return serializer_class

        parts = serializer_class.split('.')
        module_path = '.'.join(parts[:-1])
        if not module_path:
            if getattr(self, 'parent', None) is None:
                raise Exception(
                    "Can not load serializer '%s'" % serializer_class +
                    ' before binding or without specifying full path')

            # try the module of the parent class
            module_path = self.parent.__module__

        module = importlib.import_module(module_path)
        serializer_class = getattr(module, parts[-1])

        self._serializer_class = serializer_class
        return serializer_class