簡體   English   中英

Django-TypeError:“類型”是此函數的無效關鍵字參數

[英]Django - TypeError: 'genre' is an invalid keyword argument for this function

我正在使用Django,但在運行使用Django模型的Python腳本時遇到問題

我正在使用的腳本從api獲取數據並將其加載到數據庫中,但是,在嘗試運行它時遇到TypeError:

>>> 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'])

movie ['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'

嘗試這個:

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)

get_or_create()

返回(對象,已創建)的元組,其中object是已檢索或已創建的對象,並且created是一個布爾值,指定是否創建了新對象。

所以代替:

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

它應該是:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM