python - Unable to display annotated queryset in model method in django rest framework viewset -
i trying construct queryset dynamically using model method in doing receiving error in django rest framework v2.4.5 , django 1.7.8:
cannot resolve keyword 'review_count' field. choices are: description, id, name, review
i'm unable display queryset created construct_queryset method in viewset, although works fine in django admin. believe has way django rest framework instantiating models. not entirely sure might causing issue, appreciated, thank you.
i upgraded django 1.8 it's not supported django rest framework v2.4.5 , cannot upgrade v3 @ time unfortunately.
models.py:
class widget (models.model): name = models.charfield(max_length=255) description = models.charfield(max_length=255) class review (models.model): name = models.charfield(max_length=255) rating = models.integerfield( validators=[minvaluevalidator(1), maxvaluevalidator(5)] ) widget = models.foreignkey(widget) class widgetqs(models.model): """ model used constructing dynamic queryset """ order_choices = ( ('annotate_review', 'order review count'), ... ) order_by_field = models.charfield(max_length=255, choices=order_choices) def construct_queryset(self, user=none): queryset = widget.objects.all() if self.order_by_field == 'annotate_review': result_qs = queryset.annotate( review_count=count('review') ).order_by('-review_count') return result_qs serializers.py:
class widgetserializer (serializers.hyperlinkedmodelserializer): objects = serializers.serializermethodfield('get_objects') def get_objects(self, obj): request = self.context.get('request', none) if request: try: user = request.user except: user = none qs = obj.construct_queryset(user=user) if qs: return qs.values_list('id', flat=true) return [] views.py
class widgetviewset (modelviewset): serializer_class = widgetqsserializer queryset = widgetqs.objects.all() stack trace
environment: request method: request url: http://localhost:8080/api/widgetqs django version: 1.7.8 python version: 2.7.6 installed applications: (u'grappelli', u'django.contrib.admin', u'django.contrib.auth', u'django.contrib.contenttypes', u'django.contrib.sessions', u'django.contrib.messages', u'django.contrib.staticfiles', u'django.contrib.humanize', u'corsheaders', u'rest_framework', u'social.apps.django_app.default', u'widget', u'debug_toolbar') installed middleware: (u'django.contrib.sessions.middleware.sessionmiddleware', u'django.middleware.common.commonmiddleware', u'django.middleware.csrf.csrfviewmiddleware', u'django.contrib.auth.middleware.authenticationmiddleware', u'django.contrib.auth.middleware.sessionauthenticationmiddleware', u'django.contrib.messages.middleware.messagemiddleware', u'django.middleware.clickjacking.xframeoptionsmiddleware', u'social.apps.django_app.middleware.socialauthexceptionmiddleware', u'bugsnag.django.middleware.bugsnagmiddleware', u'debug_toolbar.middleware.debugtoolbarmiddleware') traceback: file "/users/nabil/.virtualenvs/widget_project/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 111. response = wrapped_callback(request, *callback_args, **callback_kwargs) file "/users/nabil/.virtualenvs/widget_project/lib/python2.7/site-packages/django/views/decorators/csrf.py" in wrapped_view 57. return view_func(*args, **kwargs) file "/users/nabil/.virtualenvs/widget_project/lib/python2.7/site-packages/rest_framework/viewsets.py" in view 79. return self.dispatch(request, *args, **kwargs) file "/users/nabil/.virtualenvs/widget_project/lib/python2.7/site-packages/rest_framework/views.py" in dispatch 403. response = self.handle_exception(exc) file "/users/nabil/.virtualenvs/widget_project/lib/python2.7/site-packages/rest_framework/views.py" in dispatch 400. response = handler(request, *args, **kwargs) file "/users/nabil/documents/projects/widget_project/widget_project/timestamp/mixins.py" in list 108. return response(serializer.data) file "/users/nabil/.virtualenvs/widget_project/lib/python2.7/site-packages/rest_framework/serializers.py" in data 576. self._data = self.to_native(obj) file "/users/nabil/.virtualenvs/widget_project/lib/python2.7/site-packages/rest_framework/serializers.py" in to_native 355. value = field.field_to_native(obj, field_name) file "/users/nabil/.virtualenvs/widget_project/lib/python2.7/site-packages/rest_framework/serializers.py" in field_to_native 414. return [self.to_native(item) item in value.all()] file "/users/nabil/.virtualenvs/widget_project/lib/python2.7/site-packages/rest_framework/serializers.py" in to_native 355. value = field.field_to_native(obj, field_name) file "/users/nabil/.virtualenvs/widget_project/lib/python2.7/site-packages/rest_framework/fields.py" in field_to_native 1043. return self.to_native(value) file "/users/nabil/.virtualenvs/widget_project/lib/python2.7/site-packages/rest_framework/fields.py" in to_native 225. return [self.to_native(item) item in value] file "/users/nabil/.virtualenvs/widget_project/lib/python2.7/site-packages/django/db/models/query.py" in __iter__ 141. self._fetch_all() file "/users/nabil/.virtualenvs/widget_project/lib/python2.7/site-packages/django/db/models/query.py" in _fetch_all 966. self._result_cache = list(self.iterator()) file "/users/nabil/.virtualenvs/widget_project/lib/python2.7/site-packages/django/db/models/query.py" in iterator 1202. row in self.query.get_compiler(self.db).results_iter(): file "/users/nabil/.virtualenvs/widget_project/lib/python2.7/site-packages/django/db/models/sql/compiler.py" in results_iter 701. rows in self.execute_sql(multi): file "/users/nabil/.virtualenvs/widget_project/lib/python2.7/site-packages/django/db/models/sql/compiler.py" in execute_sql 776. sql, params = self.as_sql() file "/users/nabil/.virtualenvs/widget_project/lib/python2.7/site-packages/django/db/models/sql/compiler.py" in as_sql 102. ordering, o_params, ordering_group_by = self.get_ordering() file "/users/nabil/.virtualenvs/widget_project/lib/python2.7/site-packages/django/db/models/sql/compiler.py" in get_ordering 430. self.query.get_meta(), default_order=asc): file "/users/nabil/.virtualenvs/widget_project/lib/python2.7/site-packages/django/db/models/sql/compiler.py" in find_ordering_name 466. field, targets, alias, joins, path, opts = self._setup_joins(pieces, opts, alias) file "/users/nabil/.virtualenvs/widget_project/lib/python2.7/site-packages/django/db/models/sql/compiler.py" in _setup_joins 499. pieces, opts, alias) file "/users/nabil/.virtualenvs/widget_project/lib/python2.7/site-packages/django/db/models/sql/query.py" in setup_joins 1463. names, opts, allow_many, fail_on_missing=true) file "/users/nabil/.virtualenvs/widget_project/lib/python2.7/site-packages/django/db/models/sql/query.py" in names_to_path 1427. self.raise_field_error(opts, name) file "/users/nabil/.virtualenvs/widget_project/lib/python2.7/site-packages/django/db/models/sql/query.py" in raise_field_error 1433. "choices are: %s" % (name, ", ".join(available))) exception type: fielderror @ /api/widgetqs exception value: cannot resolve keyword 'review_count' field. choices are: description, id, name, review
as can see in function :
def construct_queryset(self, user=none): queryset = widget.objects.all() if self.order_by_field == 'annotate_review': result_qs = queryset.annotate( review_count=count('review') ).order_by('-review_count') return result_qs your queryset is
widget.objects.all()
and trying annotate field has no relation review model. if want work, have add foreignkey model review model widget :
class widget (models.model): name = models.charfield(max_length=255) description = models.charfield(max_length=255) class review (models.model): widget = models.foreignkey(widget) name = models.charfield(max_length=255) rating = models.integerfield( validators=[minvaluevalidator(1), maxvaluevalidator(5)] )
Comments
Post a Comment