0

任何人都可以在我的代码中找到导致错误的原因?我已经搜索过了,但没有找到答案。我认为问题出在函数 objects.get(param) 上,但我不确定。

我想用我的代码做的是检索对象类型、国家、语言和导演,如果它们已经添加到数据库中的话。

这是代码:

模型.py

from django.db import models
from numpy import unique

class Director(models.Model):
    director = models.CharField(max_length=500, unique=True)

    def __unicode__(self):
        return self.director

    def __init__(self, director):
        super(Director, self).__init__()
        self.director = director

class Language(models.Model):
    language = models.CharField(max_length=500, unique=True)

    def __unicode__(self):
        return self.language

    def __init__(self, language):
        super(Language, self).__init__()
        self.language = language

class Genre(models.Model):
    genre = models.CharField(max_length=500, unique=True)

    def __unicode__(self):
        return self.genre

    def __init__(self, genre):
        super(Genre, self).__init__()
        self.genre = genre

class Country(models.Model):
    country = models.CharField(max_length=500, unique=True)

    def __unicode__(self):
        return self.country

    def __init__(self, country):
        super(Country, self).__init__()
        self.country = country

class Movie(models.Model):
    id_movie = models.CharField(max_length=200, unique=True)
    rating = models.CharField(max_length=200)
    votes = models.CharField(max_length=200)
    year = models.CharField(max_length=10)

    genre = models.ManyToManyField(Genre)
    country = models.ManyToManyField(Country)
    language = models.ManyToManyField(Language)
    directors = models.ManyToManyField(Director)

    def __init__(self, id_movie, rating, votes, year):
        super(Movie, self).__init__()
        self.id_movie = id_movie
        self.rating = rating
        self.votes = votes
        self.year = year

    def __unicode__(self):
        return self.id_movie

爬虫.py

from movie_info.models import Movie, Genre, Director, Language, Country

def get_movie_info(codigo_do_filme):
    import imdb
    ia = imdb.IMDb()
    movie = ia.get_movie(codigo_do_filme)
    return {'titulo': movie['title'], 'rating': movie['rating'], 'votes': movie['votes'], 'ano': movie['year'], 'genero': movie['genre'][0], 'pais': movie['countries'][0], 'idioma': movie['lang'][0], 'directors': movie['director']} 

def read_sheet(file_name, fieldnames=None, delimiter=",", quotechar="\n"):
    from csv import DictReader
    reader = DictReader(open(file_name,'rb'), fieldnames = fieldnames, delimiter = delimiter, quotechar=quotechar)
    return reader


def fill_db_movie_info(the_sheet_file):
    file_csv = read_sheet(the_sheet_file)

    for movie in file_csv:
    id_filme = movie['id_move']

if not Movie.objects.filter(id_movie=id_filme).exists():

    info = get_movie_info(id_filme)
    rating_imdb = info['rating']
    movie_votes = info['votes']
    movie_year = info['ano']
    movie_genre = info['genero']
    movie_country = info['pais']
    movie_lang = info['idioma']        
    movie_directors = info['directors']

    addToDB = Movie(id_filme, rating_imdb, movie_votes, movie_year)
    addToDB.save()

    if not Genre.objects.filter(genre=movie_genre).exists():
        genreToDB = Genre(movie_genre)
        genreToDB.save()
        addToDB.genre.add(genreToDB)
    else:  
        addToDB.genre.add(Genre.objects.get(genre=movie_genre))


    if not Country.objects.filter(country=movie_country).exists():
        countryToDB = Country(movie_country)
        countryToDB.save()
        addToDB.country.add(countryToDB)
    else:
        addToDB.country.add(Country.objects.get(country=movie_country))


    if not Language.objects.filter(language=movie_lang).exists():
        langToDB = Language(movie_lang)
        langToDB.save()
        addToDB.language.add(langToDB)
    else:
        addToDB.language.add(Language.objects.get(language=movie_lang))


    for m_director in movie_directors:
        if not Director.objects.filter(director=m_director['name']).exists():
            directorsToDB = Director(m_director['name'])
            directorsToDB.save()
            addToDB.directors.add(directorsToDB)
        else:
            addToDB.directors.add(Director.objects.get(director=m_director['name']))

    print "salvou: " + id_filme, rating_imdb, movie_votes, movie_year, movie_genre, movie_country, movie_lang, movie_directors[0]

追溯:

    pydev debugger: starting (pid: 1424)
Traceback (most recent call last):
  File "/Applications/eclipse/plugins/org.python.pydev_3.5.0.201405201709/pysrc/pydevd.py", line 1845, in <module>
    debugger.run(setup['file'], None, None)
  File "/Applications/eclipse/plugins/org.python.pydev_3.5.0.201405201709/pysrc/pydevd.py", line 1373, in run
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "/Users/rubenspessoa/Documents/Workspace/LearningDjango/main.py", line 7, in <module>
    fill_db_movie_info('/Users/rubenspessoa/Documents/Workspace/DATASET/test_subdataset.csv')
  File "/Users/rubenspessoa/Documents/Workspace/LearningDjango/crawler.py", line 49, in fill_db_movie_info
    addToDB.country.add(Country.objects.get(country=movie_country))
  File "/Library/Python/2.7/site-packages/django/db/models/manager.py", line 151, in get
    return self.get_queryset().get(*args, **kwargs)
  File "/Library/Python/2.7/site-packages/django/db/models/query.py", line 304, in get
    num = len(clone)
  File "/Library/Python/2.7/site-packages/django/db/models/query.py", line 77, in __len__
    self._fetch_all()
  File "/Library/Python/2.7/site-packages/django/db/models/query.py", line 857, in _fetch_all
    self._result_cache = list(self.iterator())
  File "/Library/Python/2.7/site-packages/django/db/models/query.py", line 230, in iterator
    obj = model(*row_data)
TypeError: __init__() takes exactly 2 arguments (3 given)
4

1 回答 1

1

您已经为所有模型定义__init__了方法。你不应该那样做。

于 2014-06-05T21:22:18.797 回答