【问题标题】:Django How to update model object fields from external api dataDjango 如何从外部 api 数据更新模型对象字段
【发布时间】:2020-04-06 05:13:18
【问题描述】:

我有一个在调度程序上运行的脚本,用于从 api 获取数据,然后我打算使用这些数据来更新当前的数据库模型信息。

我的模型 ShowInfo 在 main/models.py 中:

from django.contrib.auth.models import User

class ShowInfo(models.Model):
    title = models.CharField(max_length=50)
    latest_ep_num = models.FloatField()
    ld = models.BooleanField()
    sd = models.BooleanField()
    hd = models.BooleanField()
    fhd = models.BooleanField()
    following = models.ManyToManyField(User, related_name = 'following', blank=True)

我设法将问题隔离到脚本的这一部分,该部分运行但将具有相同标题的重复节目插入数据库:

    else: #test if api fails
        for t in real_title:
            if t in data_title:  #testing if the titles in the database and from the api match
                a = ShowInfo.objects.get(title=t)
                id = a.id
                b = next(item for item in show_list if item["title"] == t)
                a1 = ShowInfo(id = id, title = b["title"], latest_ep_num=b["latest_ep_num"], ld=b["ld"], sd=b["sd"],hd=b["hd"],fhd=b["fhd"])
                a1.save()

关于列表的一些附加信息(其中 show_list 是从 api 获取的字典列表):

database = ShowInfo.objects.values()
real_title = []
data_title = []

for show in show_list:
    real_title.append(show["title"])
for data in database:
    data_title.append(data["title"])

当脚本运行时,我在使用 DB Browser for SQLite 浏览我的数据库时注意到,对象正在插入,而不是按我的预期更新

脚本应该从 api 和数据库中捕获具有相同标题的节目并更新任何更改的信息。有人知道我的 save() 方法有什么问题吗?

【问题讨论】:

  • 所以你正在尝试更新a = ShowInfo.objects.get(title=t)检索到的对象对吧?
  • a = ShowInfo.objects.get(title=t) 正在尝试检索我要更新的对象。 a1.save 应该更新它
  • 你的意思是id是重复的?
  • 通过使用 DB Browser 查看我的数据库,ID 没有重复,但条目是重复的。这意味着正在插入具有相同标题的节目并且没有按照我的意愿进行更新
  • 尝试打印id

标签: python django database api django-models


【解决方案1】:

经过一天的反复试验和网上搜索,我终于找到了适合我的解决方案。

对于任何感兴趣的人,this is the solution 我从 Stack 上的另一个用户那里找到,它利用覆盖内部保存方法来强制更新,如果具有相同字段的当前对象已经在数据库中,则不插入。

其他方法,例如 force_update=Trueupdate_or_create() 在我的情况下不起作用。

【讨论】:

  • 我认为您实际上不必在此处覆盖任何内容。 a1 = ShowInfo(id = id, title = b["title"], latest_ep_num=b["latest_ep_num"], ld=b["ld"], sd=b["sd"],hd=b["hd"],fhd=b["fhd"]) a1.save() 这就是问题所在,您正在创建一个新对象而不是更新现有对象。虽然你说你已经找到了解决方案,但它就是这样。
  • 你能澄清我的误解吗?我曾认为在指定特定 id 或 pk 的同时调用 save 方法会导致 django 对该 id 已经存在的对象执行更新
猜你喜欢
  • 2020-08-13
  • 2016-05-17
  • 1970-01-01
  • 1970-01-01
  • 2021-04-06
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多