whoisearth
whoisearth

Reputation: 4170

'CurrentUserDefault' object has no attribute 'user'

I'm trying to filter a serializer field for POST based on the user logged in.

serializers.py

class WidgetListSerializer(EncryptedLookupModelSerializer):

    owner = serializers.HiddenField(default=serializers.CurrentUserDefault())
    parent = serializers.SlugRelatedField(
        slug_field='name',
        queryset=WidgetList.objects.filter(owner=serializers.CurrentUserDefault()))

    class Meta:
        model=WidgetList
        fields = ('id', 'name', 'description', 'owner', 'parent')

Traceback

Traceback:
File "/opt/myproject_app/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  119.                 resolver_match = resolver.resolve(request.path_info)
File "/opt/myproject_app/lib/python2.7/site-packages/django/core/urlresolvers.py" in resolve
  365.             for pattern in self.url_patterns:
File "/opt/myproject_app/lib/python2.7/site-packages/django/core/urlresolvers.py" in url_patterns
  401.         patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
File "/opt/myproject_app/lib/python2.7/site-packages/django/core/urlresolvers.py" in urlconf_module
  395.             self._urlconf_module = import_module(self.urlconf_name)
File "/usr/local/lib/python2.7/importlib/__init__.py" in import_module
  37.     __import__(name)
File "/opt/myproject/myproject/urls.py" in <module>
  20. from gui import views
File "/opt/myproject/gui/views.py" in <module>
  20. from api.serializers import *
File "/opt/myproject/api/serializers.py" in <module>
  52. class WidgetListSerializer(EncryptedLookupModelSerializer):
File "/opt/myproject/api/serializers.py" in WidgetListSerializer
  57.         queryset=WidgetList.objects.filter(owner=serializers.CurrentUserDefault()))
File "/opt/myproject_app/lib/python2.7/site-packages/django/db/models/manager.py" in manager_method
  127.                 return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/opt/myproject_app/lib/python2.7/site-packages/django/db/models/query.py" in filter
  679.         return self._filter_or_exclude(False, *args, **kwargs)
File "/opt/myproject_app/lib/python2.7/site-packages/django/db/models/query.py" in _filter_or_exclude
  697.             clone.query.add_q(Q(*args, **kwargs))
File "/opt/myproject_app/lib/python2.7/site-packages/django/db/models/sql/query.py" in add_q
  1310.         clause, require_inner = self._add_q(where_part, self.used_aliases)
File "/opt/myproject_app/lib/python2.7/site-packages/django/db/models/sql/query.py" in _add_q
  1338.                     allow_joins=allow_joins, split_subq=split_subq,
File "/opt/myproject_app/lib/python2.7/site-packages/django/db/models/sql/query.py" in build_filter
  1156.         value, lookups, used_joins = self.prepare_lookup_value(value, lookups, can_reuse, allow_joins)
File "/opt/myproject_app/lib/python2.7/site-packages/django/db/models/sql/query.py" in prepare_lookup_value
  1003.             value = value()
File "/opt/myproject_app/lib/python2.7/site-packages/rest_framework/fields.py" in __call__
  242.         return self.user

Exception Type: AttributeError at /api/widgetlists/
Exception Value: 'CurrentUserDefault' object has no attribute 'user'

Upvotes: 0

Views: 939

Answers (1)

mariodev
mariodev

Reputation: 15559

To be able to use logged-in user, you need to access request object first (request.user)

Here's an example how you can customize your serializer:

class WidgetListSerializer(EncryptedLookupModelSerializer):
    # ...

    def __init__(self, *args, **kwargs):
        user = kwargs['context']['request'].user

        super(WidgetListSerializer, self).__init__(*args, **kwargs)
        self.fields['owner'].default = user
        self.fields['parent'].queryset = WidgetList.objects.filter(owner=user)

Upvotes: 1

Related Questions