2013-10-04 2 views
0

У меня есть модель, как так:Джанго get_or_create TypeError: недопустимый аргумент

from django.db import models 
from django.contrib.auth.models import User 

class Skill(models.Model): 
    title = models.CharField(max_length=255) 

    def __unicode__(self): 
     return self.title 


class UserSkills(models.Model): 
    user = models.ForeignKey(User) 
    skill = models.ForeignKey(Skill) 

    def __unicode__(self): 
     return '%s | %s' % (self.user, self.skill) 

Когда я пытаюсь сделать это:

>>> u = User.objects.get(username='myuser') 
>>> s, created = Skill.objects.get_or_create(title='mysql') 
>>> type(u) 
<class 'django.contrib.auth.models.User'> 
>>> type(s) 
<class 'django_myapp.models.Skill'> 

>>> userskill, created = UserSkills.objects.get_or_create(skill=s, user=u) 
TypeError: 'skill' is an invalid keyword argument for this function 

Что я делаю неправильно здесь?

Как и в сторону, я чувствую, что моя UserSkills модель может быть излишним - она ​​должна быть просто ManyToMany поле на Skill к User модели?

Любая помощь очень ценится.

EDIT:

Traceback:

Traceback (most recent call last): 
File "<console>", line 1, in <module> 
File "/home/sam/.envs/rs-open-auth/local/lib/python2.7/site-packages/django/db/models/manager.py", line 149, in create 
return self.get_query_set().create(**kwargs) 
File "/home/sam/.envs/rs-open-auth/local/lib/python2.7/site-packages/django/db/models/query.py", line 414, in create 
obj = self.model(**kwargs) 
File "/home/sam/.envs/rs-open-auth/local/lib/python2.7/site-packages/django/db/models/base.py", line 415, in __init__ 
raise TypeError("'%s' is an invalid keyword argument for this function" % list(kwargs)[0]) 
+0

Что Джанго версия это – mariodev

+0

Django версии == 1.5.4 –

+0

Можете ли вы отправлять сообщения всем TRACEBACK .. – mariodev

ответ

0

Когда вы звоните:

userskill, created = UserSkills.objects.get_or_create(skill=s, user=u) 

"s" предварительно определен как 'MySQL' ("s" является строкой) , Однако при создании новой записи модели, которая имеет внешний ключ «умения», «умение» должно быть первичным ключом (т. Е. 1, 2 и т. Д.). Вы можете сделать это путем вызова первичного ключа непосредственно (если «мастерство» вы только что создали это первый навык в модели умений, например:

userskill, created = UserSkills.objects.get_or_create(skill=1, user=u) 

или вы можете вызвать первичный ключ «с», как так чтобы создать новый экземпляр UserSkills:?.

userskill, created = UserSkills.objects.get_or_create(skill=s.pk, user=u) 
+0

это не работает. Я все еще получаю' TypeError: 'skill' - это i аргумент ключевого слова nvalid для этой функции. Кажется, это атрибут навыка, который имеет проблему. –

+0

Вы запустили команду manage.py syncdb? и «умение» правильно добавлено в качестве внешнего ключа в таблицу UserSkills? –

+0

Да, у меня есть и есть. –

Смежные вопросы