2016-09-16 75 views
0

我使用Django和我在運行使用Django模型Django的 - 類型錯誤:「類型」是這個函數

,我使用該腳本需要一個Python腳本問題無效的關鍵字參數從一個API,並將其加載到我的數據庫的數據,但是,我得到一個類型錯誤,而試圖運行它:

>>> exec(open('load_from_api.py').read()) 
Traceback (most recent call last): 
    File "C:\Program Files (x86)\Python35-32\lib\site-packages\django\core\managem 
ent\commands\shell.py", line 69, in handle 
    self.run_shell(shell=options['interface']) 
    File "C:\Program Files (x86)\Python35-32\lib\site-packages\django\core\managem 
ent\commands\shell.py", line 61, in run_shell 
    raise ImportError 
ImportError 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "C:\Program Files (x86)\Python35-32\lib\site-packages\django\db\models\qu 
ery.py", line 465, in get_or_create 
    return self.get(**lookup), False 
    File "C:\Program Files (x86)\Python35-32\lib\site-packages\django\db\models\qu 
ery.py", line 387, in get 
    self.model._meta.object_name 
movies.models.DoesNotExist: Movie matching query does not exist. 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "<string>", line 24, in <module> 
    File "C:\Program Files (x86)\Python35-32\lib\site-packages\django\db\models\ma 
nager.py", line 122, in manager_method 
    return getattr(self.get_queryset(), name)(*args, **kwargs) 
    File "C:\Program Files (x86)\Python35-32\lib\site-packages\django\db\models\qu 
ery.py", line 467, in get_or_create 
    return self._create_object_from_params(lookup, params) 
    File "C:\Program Files (x86)\Python35-32\lib\site-packages\django\db\models\qu 
ery.py", line 499, in _create_object_from_params 
    obj = self.create(**params) 
    File "C:\Program Files (x86)\Python35-32\lib\site-packages\django\db\models\qu 
ery.py", line 399, in create 
    obj = self.model(**kwargs) 
    File "C:\Program Files (x86)\Python35-32\lib\site-packages\django\db\models\ba 
se.py", line 443, in __init__ 
    raise TypeError("'%s' is an invalid keyword argument for this function" % li 
st(kwargs)[0]) 
TypeError: 'genre' is an invalid keyword argument for this function 

電影模式:

class Movie(models.Model): 
    title = models.CharField(max_length=511) 
    tmdb_id = models.IntegerField(null=True, blank=True) 
    release = models.DateField(null=True, blank=True) 
    poster = models.TextField(max_length=500) 
    backdrop = models.TextField(max_length=500, null=True, blank=True) 
    rating = models.FloatField(null=True, blank=True) 
    description = models.TextField() 
    director = models.ManyToManyField(Person, related_name="directed_movies") 
    actors = models.ManyToManyField(Person, related_name="acted_movies") 
    genre = models.ManyToManyField(Genre) 

和我使用從腳本片段:

for movie in results: 
    data = Movie.objects.get_or_create(title=movie['title'], 
             tmdb_id=movie['id'], 
             release=movie['release_date'], 
             genre=movie['genre_ids'], 
             description=movie['overview'], 
             backdrop=movie['backdrop_path'], 
             poster=movie['poster_path']) 

電影[ 'genre_ids']來以列表的形式:例如[42,67,80]或[12,109]。

我不確定我在哪裏錯了,任何幫助將不勝感激!

編輯:

當我改變了我的腳本是:

for movie in results: 
    data = Movie.objects.get_or_create(title=movie['title'], 
             tmdb_id=movie['id'], 
             release=movie['release_date'], 
             description=movie['overview'], 
             backdrop=movie['backdrop_path'], 
             poster=movie['poster_path']) 
    genres = [] 
    genres = movie['genre_ids'] 
    for gnre in genres: 
     data.genre.add(gnre) 

它給了我下面的錯誤:

AttributeError: 'tuple' object has no attribute 'genre' 
+0

看起來你需要做'makemigrations'和'migrate' –

+0

在應用程序檢測到沒有任何變化! – mari

+0

請參閱[此問題](http://stackoverflow.com/questions/12254033/django-get-or-create-return-error-tuple-object-has-no-attribute/12254139#12254139)來解釋屬性錯誤。 – Alasdair

回答

0

get_or_create()

Returns a tuple of (object, created), where object is the retrieved or created object and created is a boolean specifying whether a new object was created.

所以不是:

data = Movie.objects.get_or_create(title=movie['title'], 
            ....) 

它應該是:

data, created = Movie.objects.get_or_create(title=movie['title'], 
              ....) 
0

試試這個:

for movie in results: 
    obj, data = Movie.objects.get_or_create(title=movie['title'], 
             tmdb_id=movie['id'], 
             release=movie['release_date'], 
             description=movie['overview'], 
             backdrop=movie['backdrop_path'], 
             poster=movie['poster_path']) 
    genre_ids = movie['genre_ids'] 
    genres = Genre.objects.filter(id__in=genre_ids) 
    obj.genre.add(*genres) 
+0

恐怕沒有工作,它給了我一個NameError:name'Genre'not defined – mari

+0

您應該導入Genre模型,'from yourapp.models import Genre' – arcegk

+0

它給了我AttributeError:'bool'object has no屬性'類型' – mari

相關問題