我有教授的模型,需要"批量更新".我必须在数据库的两个请求中完成这项工作.

我的模特.

 class Professor(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    age = models.IntegerField(default=18)
    class Meta:
        indexes = [models.Index(fields=['first_name'])]

我的密码

def update_professor_first_names(first_name_updates: List[NameUpdate]):
    prof_id = [id for id, name in first_name_updates]
    prof = Professor.objects.filter(id__in=prof_id)
    tmp = []
    for prof_id, new_first_name in first_name_updates:
        prof.first_name = new_first_name
        tmp.append(prof)
    Professor.objects.bulk_update(tmp, ['first_name'])

你能给我一些建议吗?

推荐答案

你的profProfessor中的QuerySet,而不是一个Professor,因此写prof.first_name = new_first_name是没有意义的,它也会导致tmp是同一个QuerySet中的list重复多次.

您应该查找Professor对象,并相应地指定它,以便:

def update_professor_first_names(first_name_updates: List[NameUpdate]):
    prof_id = [id for id, name in first_name_updates]
    profs = {p.id: p for p in Professor.objects.filter(id__in=prof_id)}
    tmp = []
    for prof_id, new_first_name in first_name_updates:
        prof = profs[prof_id]
        prof.first_name = new_first_name
        tmp.append(prof)
    Professor.objects.bulk_update(tmp, ['first_name'])

Django相关问答推荐

构造一个定制字符串(实体、年份和字母数字的组合)作为Django中的Postgres数据库的主键是否明智?

APIView查询未返回任何结果

将两个视图重定向到具有不同 url id Django 的一个模板的正确方法

Django rest framework, AttributeError: 'str' object has no attribute 'data' 无法使用表单上传图片

如何在视图中的 Django 重定向末尾附加字符串?

如何在 Django 模板视图中显示我的数据?

包含资源时,DRF 返回我的软删除记录

遍历django模板中的外键相关表

Django - 站点匹配查询不存在

未捕获的类型错误:$(...).datepicker is not a function(anonymous function)

如何缓存 Django Rest Framework API 调用?

Django 管理命令参数

Apache + mod_wsgi 与 nginx + gunicorn

创建新内容类型时出错.请确保在try 单独迁移应用程序之前迁移内容类型

django 有条件地过滤对象

如何使用 django-nose 运行单个测试或单个 TestCase?

保存前向 ModelForm 对象添加数据

django 应用基于条件的样式类

django select_related - 何时使用它

从 git 存储库中删除并忽略所有具有扩展名的文件