无法在django rest框架视图集中的模型方法中显示带注释的查询集

时间:2015-07-07 16:16:37

标签: python django python-2.7 django-models django-rest-framework

我正在尝试使用模型方法动态构造一个查询集但是这样做我在django rest framework v2.4.5和django 1.7.8中收到了这个错误:

Cannot resolve keyword 'review_count' into field. Choices are: description, id, name, review

我无法在我的视图集中显示由construct_queryset方法创建的查询集,尽管它在django admin中运行正常。我认为它与django rest框架实例化模型的方式有关。我不完全确定可能导致此问题的原因,任何帮助将不胜感激,谢谢。

我已升级到django 1.8,但django rest framework v2.4.5不支持此版本,我不能在此时升级到v3。

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):
    """ A model used for constructing a dynamic queryset """
    ORDER_CHOICES = (
        ('annotate_review', 'order by 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()

堆栈跟踪

Environment:


Request Method: GET
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) for 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) for 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.             for 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.         for 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 at /api/widgetqs
Exception Value: Cannot resolve keyword 'review_count' into field. Choices are: description, id, name, review

1 个答案:

答案 0 :(得分:1)

正如您在函数中看到的那样:

 'Account Log In': function accLogin(client) {
    var user = client.globals.userNames.clientEmail;

    client
      .url(yourUrl)
      .waitForElementVisible('yourUserNameField', 1000)
      .setValue('yourUserNameField', user)
      .end();
}

您的查询集是

Widget.objects.all()

并且您正在尝试注释与您的Review模型无关的字段。 如果你希望这个工作,你必须添加一个外键给你的模型Review for Model Widget,如下所示:

"test_settings" : {
    "default" : {
      "launch_url" : "http://localhost",
      "selenium_port"  : 4444,
      "selenium_host"  : "localhost",
      "globals": {
        "myGlobal" : "some_required_global"
      }
    }
}