Django - get_or_create(),auto_now = True

时间:2016-09-29 23:45:28

标签: python django

我正在使用Django,我遇到了使用Django模型的Python脚本的问题 我正在使用的脚本从api获取数据并将其加载到我的数据库中。

我的模特:

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

我遇到的问题是每当我运行脚本时,条目都会重复,因为编辑字段是更改的,但我放置编辑字段的目的是知道电影何时被编辑,即:其他一些领域变了。

如何避免重复,还要保留编辑字段,以防发生真正的变化?

1 个答案:

答案 0 :(得分: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)