2017-02-17 259 views
0

這是給錯誤int() argument must be a string or a number,not 'Choice' 我是新來的Django的REST框架 請幫助int()函數的參數必須是字符串或數字,而不是「選擇」

這是我serializers.py

class VoteSerializer(ModelSerializer): 
    class Meta: 
     model=Vote 
     fields='__all__' 

    def from_native(self, data, files): 
     data['poll_id'] = self.context['pollid'] 
     return super(VoteSerializer, self).from_native(data, files) 

    def validate(self, data): 
     choice=data.get("choice",None) 
     user=data.get("id",None) 
     polid=data.get("poll_id") 
     if not user and not choice: 
      raise ValidationError("A user and choice has to be present") 

     choice_poll_obj=Choice.objects.filter(
      Q(id=choice) | 
      Q(poll=polid) 
     ).distinct() 

     user_obj=User.objects.get(id=user) 
     if user_obj.exists() and choice_poll_obj.exists(): 
      pass 
     else: 
      raise ValidationError("This choice/user is not valid for this question") 

     return data 

這是我的views.py

class VotesAPIView (CreateAPIView) : 
    serializer_class = VoteSerializer 

    def post(self, request, *args, **kwargs): 
     data = request.data # like request.post 
     poll = Poll.objects.get(id=kwargs['pk']) 
     poll_id=poll.id 
     serializer = VoteSerializer(data=request.data,context={'pollid': poll_id}) 
     if serializer.is_valid(raise_exception=True): 
      new_data = serializer.data 
      return Response(new_data, status=HTTP_200_OK) 
     return Response(serializer.errors, status=HTTP_400_BAD_REQUEST) 

這是我的代碼的回溯。請看看這個:

Environment: 


Request Method: POST 
Request URL: http://localhost/pollsAPI/1/vote 

Django Version: 1.10.5 
Python Version: 2.7.6 
Installed Applications: 
['django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'rest_framework', 
'polls.apps.PollsConfig'] 
Installed Middleware: 
['django.middleware.security.SecurityMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware'] 



Traceback: 

File "/home/yodaplus/Documents/env_rest/local/lib/python2.7/site-packages/django/core/handlers/exception.py" in inner 
    39.    response = get_response(request) 

File "/home/yodaplus/Documents/env_rest/local/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response 
    187.     response = self.process_exception_by_middleware(e, request) 

File "/home/yodaplus/Documents/env_rest/local/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response 
    185.     response = wrapped_callback(request, *callback_args, **callback_kwargs) 

File "/home/yodaplus/Documents/env_rest/local/lib/python2.7/site-packages/django/views/decorators/csrf.py" in wrapped_view 
    58.   return view_func(*args, **kwargs) 

File "/home/yodaplus/Documents/env_rest/local/lib/python2.7/site-packages/django/views/generic/base.py" in view 
    68.    return self.dispatch(request, *args, **kwargs) 

File "/home/yodaplus/Documents/env_rest/local/lib/python2.7/site-packages/rest_framework/views.py" in dispatch 
    483.    response = self.handle_exception(exc) 

File "/home/yodaplus/Documents/env_rest/local/lib/python2.7/site-packages/rest_framework/views.py" in handle_exception 
    443.    self.raise_uncaught_exception(exc) 

File "/home/yodaplus/Documents/env_rest/local/lib/python2.7/site-packages/rest_framework/views.py" in dispatch 
    480.    response = handler(request, *args, **kwargs) 

File "/home/yodaplus/Documents/RESTAPIs/polls/views.py" in post 
    94.   if serializer.is_valid(raise_exception=True): 

File "/home/yodaplus/Documents/env_rest/local/lib/python2.7/site-packages/rest_framework/serializers.py" in is_valid 
    236.     self._validated_data = self.run_validation(self.initial_data) 

File "/home/yodaplus/Documents/env_rest/local/lib/python2.7/site-packages/rest_framework/serializers.py" in run_validation 
    434.    value = self.validate(value) 

File "/home/yodaplus/Documents/RESTAPIs/polls/serializers.py" in validate 
    123.     Q(poll=polid) 

File "/home/yodaplus/Documents/env_rest/local/lib/python2.7/site-packages/django/db/models/manager.py" in manager_method 
    85.     return getattr(self.get_queryset(), name)(*args, **kwargs) 

File "/home/yodaplus/Documents/env_rest/local/lib/python2.7/site-packages/django/db/models/query.py" in filter 
    796.   return self._filter_or_exclude(False, *args, **kwargs) 

File "/home/yodaplus/Documents/env_rest/local/lib/python2.7/site-packages/django/db/models/query.py" in _filter_or_exclude 
    814.    clone.query.add_q(Q(*args, **kwargs)) 

File "/home/yodaplus/Documents/env_rest/local/lib/python2.7/site-packages/django/db/models/sql/query.py" in add_q 
    1227.   clause, _ = self._add_q(q_object, self.used_aliases) 

File "/home/yodaplus/Documents/env_rest/local/lib/python2.7/site-packages/django/db/models/sql/query.py" in _add_q 
    1247.      current_negated, allow_joins, split_subq) 

File "/home/yodaplus/Documents/env_rest/local/lib/python2.7/site-packages/django/db/models/sql/query.py" in _add_q 
    1253.      allow_joins=allow_joins, split_subq=split_subq, 

File "/home/yodaplus/Documents/env_rest/local/lib/python2.7/site-packages/django/db/models/sql/query.py" in build_filter 
    1187.    condition = self.build_lookup(lookups, col, value) 

File "/home/yodaplus/Documents/env_rest/local/lib/python2.7/site-packages/django/db/models/sql/query.py" in build_lookup 
    1083.     return final_lookup(lhs, rhs) 

File "/home/yodaplus/Documents/env_rest/local/lib/python2.7/site-packages/django/db/models/lookups.py" in __init__ 
    19.   self.rhs = self.get_prep_lookup() 

File "/home/yodaplus/Documents/env_rest/local/lib/python2.7/site-packages/django/db/models/lookups.py" in get_prep_lookup 
    59.    return self.lhs.output_field.get_prep_value(self.rhs) 

File "/home/yodaplus/Documents/env_rest/local/lib/python2.7/site-packages/django/db/models/fields/__init__.py" in get_prep_value 
    946.   return int(value) 

Exception Type: TypeError at /pollsAPI/1/vote 
Exception Value: int() argument must be a string or a number, not 'Choice' 
+0

請包括回溯。 – Sayse

+0

@Sayse添加了回溯 – Anup

+0

我回滾了您的上次編輯,因爲您刪除的回溯實際上是問題的最重要部分 – e4c5

回答

0

它可能應該是

choice_poll_obj=Choice.objects.filter(
     Q(id=choice) | 
     Q(poll_id=polid) # <- use poll_id instead of poll 
    ).distinct() 
+0

沒有隊友。不工作 – Anup

+0

@Anup請在'validate'方法中提供'print(type(polid))'的輸出。 –

+0

輸出是一個對象民意調查。所以我提取了ID,它給了我一個整數。仍然顯示相同的錯誤 – Anup

0

應該是調查雙下劃線標識。

choice_poll_obj=Choice.objects.filter(
     Q(id=choice) | 
     Q(poll__id=polid) 
    ).distinct() 
相關問題