예제 #1
0
    def get_resource_name_from_id_field(self, field_name, id_field):
        parent_serializer = get_parent_serializer(id_field)
        if isinstance(id_field, dja_serializers.ResourceRelatedField):
            return id_field.get_resource_type_from_included_serializer()

        elif isinstance(id_field, serializers.Serializer):
            return json_api_utils.get_resource_type_from_serializer(id_field)

        # Other kinds of fields
        if hasattr(id_field, 'model'):
            model = id_field.model
        elif hasattr(id_field, 'get_queryset') and id_field.get_queryset():
            model = id_field.get_queryset().model
        # If the RelatedField hasn't got a queryset, take model from the serializer and find proper model field
        else:
            serializer_meta = getattr(parent_serializer, 'Meta', None)
            this_model = getattr(serializer_meta, 'model', None)

            source = getattr(id_field, 'source', '') or id_field.field_name
            if not source and isinstance(id_field.parent,
                                         serializers.ManyRelatedField):
                source = getattr(id_field.parent, 'source',
                                 '') or id_field.parent.field_name

            model = get_related_model(this_model, source)

        # Resource name from model
        if model:
            return get_resource_type_from_model(model)

        raise ValueError(
            f"Unable to extract resource name for {parent_serializer}.{field_name} serializer field"
        )
 def to_internal_value(self, data):
     if data['type'] != get_resource_type_from_model(self.model_class):
         self.fail('incorrect_model_type', model_type=self.model_class, received_type=data['type'])
     try:
         return get_instance_from_id(self.model_class, data['id'])
     except ObjectDoesNotExist:
         self.fail('does_not_exist', pk_value=data['id'])
     except (TypeError, ValueError):
         self.fail('incorrect_type', data_type=type(data['id']).__name__)
예제 #3
0
 def to_internal_value(self, data):
     if data['type'] != get_resource_type_from_model(self.model_class):
         self.fail('incorrect_model_type', model_type=self.model_class, received_type=data['type'])
     pk = data['id']
     try:
         return self.model_class.objects.get(pk=pk)
     except ObjectDoesNotExist:
         self.fail('does_not_exist', pk_value=pk)
     except (TypeError, ValueError):
         self.fail('incorrect_type', data_type=type(data['pk']).__name__)
예제 #4
0
 def to_internal_value(self, data):
     if data['type'] != get_resource_type_from_model(self.model_class):
         self.fail('incorrect_model_type', model_type=self.model_class, received_type=data['type'])
     pk = data['auction']
     try:
         return self.model_class.objects.get(pk=pk)
     except ObjectDoesNotExist:
         self.fail('does_not_exist', pk_value=pk)
     except (TypeError, ValueError):
         self.fail('incorrect_type', data_type=type(data['pk']).__name__)
 def to_internal_value(self, data):
     if data["type"] != get_resource_type_from_model(self.model_class):
         self.fail(
             "incorrect_model_type",
             model_type=self.model_class,
             received_type=data["type"],
         )
     pk = data["id"]
     try:
         return self.model_class.objects.get(pk=pk)
     except ObjectDoesNotExist:
         self.fail("does_not_exist", pk_value=pk)
     except (TypeError, ValueError):
         self.fail("incorrect_type", data_type=type(data["pk"]).__name__)
예제 #6
0
    def get_resource_name_from_related_id_field(self, field_name, id_field):
        # Unpack ManyRelatedField from many wrapper
        id_field = getattr(id_field, 'child_relation', None) or id_field

        # Not very frequent case but different from others
        if isinstance(id_field, serializers.Serializer):
            return json_api_utils.get_resource_type_from_serializer(id_field)
        # Most cases
        else:
            # Try to get from included serializers
            parent_serializer = get_parent_serializer(id_field)
            if isinstance(id_field, dja_serializers.ResourceRelatedField):
                resource_name = id_field.get_resource_type_from_included_serializer(
                )
                if resource_name:
                    return resource_name

            related_model = get_field_related_model(id_field)
            if related_model:
                return get_resource_type_from_model(related_model)

        raise ValueError(
            f"Unable to extract resource name for {parent_serializer}.{field_name} serializer field"
        )