TypeError:int()参数必须是字符串,类字节对象或数字,而不是' dict'在Django中创建令牌时

时间:2016-01-26 14:36:37

标签: django django-rest-framework

我在认证方面遇到问题。我正在尝试创建令牌但是得到错误" int()参数必须是字符串,类似字节的对象或数字,而不是' dict' & #34 ;.下面是我的代码的快照。

*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'*

尽力解决这个问题而不问。任何帮助将不胜感激。

提前致谢。

2 个答案:

答案 0 :(得分:2)

不幸的是,get_or_create()无法按照您展示的方式运行,也就是说,它不会跨越关系。您必须有现有用户才能创建令牌:

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

答案 1 :(得分:0)

请参阅https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/authtoken/models.py#L21了解Token型号代码。

您必须传递User个对象,而不仅仅是用户名/密码的组合。

首先创建用户myuser,然后执行Token.objects.get_or_create(myuser)