2016-09-29 76 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'中的'背景'和'流行度'字段。 –

回答

1

但我放編輯欄的目的是爲了知道電影 究竟編輯了什麼時候,即:其他一些領域被改變了。

這可能意味着您正在使用錯誤的功能。您應該使用update_or_create istead。

一種用給定kwargs更新對象的便捷方法, 根據需要創建一個新對象。缺省值是用於更新對象的字典 (字段,值)對。

這與get_or_create不同,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

通過添加'data,created = Movie.objects.update_or_create(tmdb_id = movie ['id'], defaults = {'title':movie ['title'],...)' – mari

+0

很喜歡聽。與您的項目一切順利 – e4c5

+0

感謝您的幫助! – mari

相關問題