2016-01-26 2 views
2

У меня проблемы с аутентификацией. Я пытаюсь создать токен, но получаю ошибку «Аргумент int() должен быть строкой, байтовым объектом или числом, а не« dict »». Ниже приведен снимок моего кода.ТипError: аргумент int() должен быть строкой, байтовым объектом или числом, а не «dict» при создании Token в Django.

*Type "help", "copyright", "credits" or "license" for more information. 
(InteractiveConsole) 
>>> from rest_framework.authtoken.models import Token 
>>> Token.objects.get_or_create(user={'password': '123456', 'username': 'username'}) 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/home/.virtualenvs/venv/lib/python3.4/site-packages/django/db/models/manager.py", line 127, in manager_method 
    return getattr(self.get_queryset(), name)(*args, **kwargs) 
    File "/home/.virtualenvs/venv/lib/python3.4/site-packages/django/db/models/query.py", line 405, in get_or_create 
    return self.get(**lookup), False 
    File "/home/.virtualenvs/venv/lib/python3.4/site-packages/django/db/models/query.py", line 325, in get 
    clone = self.filter(*args, **kwargs) 
    File "/home/.virtualenvs/venv/lib/python3.4/site-packages/django/db/models/query.py", line 679, in filter 
    return self._filter_or_exclude(False, *args, **kwargs) 
    File "/home/.virtualenvs/venv/lib/python3.4/site-packages/django/db/models/query.py", line 697, in _filter_or_exclude 
    clone.query.add_q(Q(*args, **kwargs)) 
    File "/home/.virtualenvs/venv/lib/python3.4/site-packages/django/db/models/sql/query.py", line 1309, in add_q 
    clause, require_inner = self._add_q(where_part, self.used_aliases) 
    File "/home/.virtualenvs/venv/lib/python3.4/site-packages/django/db/models/sql/query.py", line 1337, in _add_q 
    allow_joins=allow_joins, split_subq=split_subq, 
    File "/home/.virtualenvs/venv/lib/python3.4/site-packages/django/db/models/sql/query.py", line 1199, in build_filter 
    lookups, value) 
    File "/home/.virtualenvs/venv/lib/python3.4/site-packages/django/db/models/fields/related.py", line 1756, in get_lookup_constraint 
    lookup_class(target.get_col(alias, source), val), AND) 
    File "/home/.virtualenvs/venv/lib/python3.4/site-packages/django/db/models/lookups.py", line 101, in __init__ 
    self.rhs = self.get_prep_lookup() 
    File "/home/.virtualenvs/venv/lib/python3.4/site-packages/django/db/models/lookups.py", line 139, in get_prep_lookup 
    return self.lhs.output_field.get_prep_lookup(self.lookup_name, self.rhs) 
    File "/home/.virtualenvs/venv/lib/python3.4/site-packages/django/db/models/fields/__init__.py", line 727, in get_prep_lookup 
    return self.get_prep_value(value) 
    File "/home/.virtualenvs/venv/lib/python3.4/site-packages/django/db/models/fields/__init__.py", line 985, in get_prep_value 
    return int(value) 
TypeError: int() argument must be a string, a bytes-like object or a number, not 'dict'* 

Пробовал мое решение, чтобы решить это, не спрашивая. Любая помощь будет оценена по достоинству.

Заранее спасибо.

+1

Не должен ли пользователь быть объектом «Пользователь»? Почему вы проходите словарь? –

+0

Спасибо !!! Извините за глупый вопрос –

ответ

2

К сожалению, get_or_create() не работает так, как вы показывали, т. Е. Не затрагивает отношения. Вы должны иметь существующий пользователь, чтобы создать маркер:

>>> user = User.objects.get(username='username') # Or create one 
>>> Token.objects.get_or_create(user=user) 
+0

Спасибо! Это сработало ... –

0

См https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/authtoken/models.py#L21Token для кода модели.

Вам необходимо передать объект User, а не только комбинацию имени пользователя и пароля.

Сначала создайте пользователя myuser, затем сделайте Token.objects.get_or_create(myuser).

+0

Спасибо! Это сработало –