当前位置: 首页 > 知识库问答 >
问题:

如何在Django上的一个查询中保存所有模型更改

海典
2023-03-14

我试图修改一些模型(如< code>User模型)许多实例,这些更改是不同的(我不想使用update QuerySet方法,这对于我的场景不起作用)。

例如,一些用户需要更改first_name,一些用户需要更改last_name并获得如下用户:all_user=User.objects.all()

我认为如果我在更改后对每个实例使用保存方法,Django会发送一个保存查询!

如何将对数据库的所有更改保存在一个查询中,而不是在模型上使用 foreach 并逐个保存?

共有1个答案

翟善
2023-03-14

鉴于@iklinac的评论,我完全建议实施django自己的批量更新方法

这与我下面的原始答案非常相似,但看起来功能现在是内置的。

# bulk_update(objs, fields, batch_size=None)
>>> objs = [
...    Entry.objects.create(headline='Entry 1'),
...    Entry.objects.create(headline='Entry 2'),
... ]
>>> objs[0].headline = 'This is entry 1'
>>> objs[1].headline = 'This is entry 2'
>>> Entry.objects.bulk_update(objs, ['headline'])

原答案

有一个叫做django-bulk-update的包,类似于内置在django中的批量创建。

我使用它的一个例子是管理类中操作的一部分;

@admin.register(Token)
class TokenAdmin(admin.ModelAdmin):
    list_display = (
        'id',
        'type'
    )

    actions = (
        'set_type_charity',
    )

    def set_type_charity(self, request, queryset):
        for token in queryset:
            token.type = Token.Type.CHARITY

        bulk_update(
            queryset,
            update_fields=['type', 'modified'],
            batch_size=1000
        )

用法,取自其自述文件;

与经理:

import random
from django_bulk_update.manager import BulkUpdateManager
from tests.models import Person

class Person(models.Model):
    ...
    objects = BulkUpdateManager()

random_names = ['Walter', 'The Dude', 'Donny', 'Jesus']
people = Person.objects.all()
for person in people:
  person.name = random.choice(random_names)

Person.objects.bulk_update(people, update_fields=['name'])  # updates only name column
Person.objects.bulk_update(people, exclude_fields=['username'])  # updates all columns except username
Person.objects.bulk_update(people)  # updates all columns
Person.objects.bulk_update(people, batch_size=50000)  # updates all columns by 50000 sized chunks

与帮手:

import random
from django_bulk_update.helper import bulk_update
from tests.models import Person

random_names = ['Walter', 'The Dude', 'Donny', 'Jesus']
people = Person.objects.all()
for person in people:
  person.name = random.choice(random_names)

bulk_update(people, update_fields=['name'])  # updates only name column
bulk_update(people, exclude_fields=['username'])  # updates all columns except username
bulk_update(people, using='someotherdb')  # updates all columns using the given db
bulk_update(people)  # updates all columns using the default db
bulk_update(people, batch_size=50000)  # updates all columns by 50000 sized chunks using the default db
 类似资料:
  • 我已将以下代码放在脚本文件的顶部 现在我可以导入我的django应用程序并运行小片段(主要是测试东西) 我想导入通过 我知道https://github.com/django-extensions/django-extensions运行它会自动导入所有型号和更多型号。 我在看他们的代码。不确定我是否能理解。 https://github.com/django-extensions/django-e

  • 问题内容: 我需要在Django模型中存储一些数据。这些数据并不等于模型的所有实例。 最初,我考虑过将模型子类化,但是我试图保持应用程序的灵活性。如果使用子类,则每次需要新的对象时都需要创建一个整个类,这是不好的。我还将最终得到很多子类,仅用于存储一对额外的字段。 我真的觉得词典是最好的方法,但是Django文档中没有关于在Django模型中存储词典的内容(或者我找不到它)。 有什么线索吗? 问题

  • 问题内容: 在保存模型之前,我需要重新调整图片大小。但是,如何检查是否添加了新图片或仅更新了说明,以便每次保存模型时都可以跳过重新缩放? 我只想在加载新图像或更新图像时重新缩放,而在更新说明时不想要。 问题答案: 一些想法: 不确定是否可以在所有伪自动django工具中正常运行(例如:ModelForm,contrib.admin等)。

  • 问题内容: 有没有一种方法可以查询数据库以找出所有表中有多少行? IE 希望你能指教 问题答案:

  • 问题是: 使用这样指定的keras模型(部分): 是否可以在模型中保存所有详细信息以供以后使用? 详情如下: 我一直在遵循machinelearningmastery.com的一个例子,试图修改和添加模型的特征/参数,例如 激活class='relu' 正如问题所暗示的,我想存储模型设置以供以后使用。我知道这些参数是不同函数的一部分,但它们是否都是可能的呢? 我尝试过的: 1. 和 只有回报 序列

  • 问题内容: 在保存模型之前,我需要重新调整图片大小。但是,如何检查是否添加了新图片或仅更新了说明,以便每次保存模型时都可以跳过重新缩放? 我只想在加载新图像或更新图像时重新缩放,而在更新说明时不想要。 问题答案: 一些想法: 不确定是否可以在所有伪自动django工具中正常运行(例如:ModelForm,contrib.admin等)。