2016-09-29 14 views
1

私はDjangoを使用していますが、Djangoモデルを使用するPythonスクリプトで問題が発生しています 私が使用しているスクリプトは、APIからデータを取得して、データベース。Django-get_or_create()with auto_now = True

私のモデル:

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, null=True) 
    runtime = models.IntegerField(null=True, blank=True) 
    description = models.TextField(null=True, blank=True) 
    edit = models.DateTimeField(auto_now=True, null=True, blank=True) 
    backdrop = models.TextField(max_length=500, null=True, blank=True) 
    popularity = models.TextField(null=True, blank=True) 

スクリプト:

movies = tmdb.Movies().upcoming() 
results = movies['results'] 
ids = [] 
for movie in results: 
    data, created = 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'], 
               popularity=movie['popularity']) 

私がいる問題は、私は、スクリプトを実行するたびに編集フィールドが変更されるため、エントリが重複しているということですが、私が編集フィールドを置く目的は、映画がいつ正確に編集されたか、つまりいくつかの他のフィールドが変更されたことを知ることです。

重複を避けるにはどうすればよいですか。実際の変更が起こった場合に備えて編集フィールドを保持しますか?

+0

'Movie'モデルの' save() 'メソッドをオーバーライドしましたか? –

+0

@CarlosMermingasいいえ私はしていないし、私はかなりそれを行う方法がわからない、私はかなりdjangoの新しいです – mari

+0

私は参照してください。私は別の相互作用があったかどうか疑問に思いました。このエラーを再現するための小さなプロジェクトを作成しましたが、再現できませんでした。これは***あなたが実行しているコードです***をダブルチェックしてください。 'get_or_create'の' backdrop'と 'popularity'フィールドはMovieモデルには存在しません。 –

答えて

1

私が編集フィールドを置く目的は、正確に映画 がいつ編集されたかを知ることです。つまり、他のフィールドが変更されました。

おそらく間違った機能を使用している可能性があります。 update_or_create isteadを使用する必要があります。

与えられたkwargsでオブジェクトを更新する便利な方法は、必要に応じて新しいものを作成することです( )。デフォルトは、オブジェクトを更新するために使用される (フィールド、値)のペアの辞書です。

これはオブジェクトが存在しない場合はオブジェクトを作成するget_or_createとは異なります。オブジェクトが存在する場合は単にオブジェクトを取得します。 update_or_createは実際に更新するものです。私は重複を避けるため、いくつかの本当の変化が起こった場合 でも、編集フィールドを維持するにはどうすればよい

しかし、この方法に変更すると、この問題を解決しないのですか?

いずれのフィールドにも一意のインデックスがないため、重複が作成されます。 get_or_createupdate_or_createの両方には、固有のフィールドが必要です。

class Movie(models.Model): 
    title = models.CharField(max_length=511) 
    tmdb_id = models.IntegerField(unique=True) 
+0

それは私のために働いた 'データを作成しました= Movie.objects.update_or_create(tmdb_id = movie ['id']、 defaults = {'タイトル':映画['タイトル']、...)' – mari

+0

聞く。あなたのプロジェクトに全力を尽くして – e4c5

+0

ありがとうございました! – mari

関連する問題