Django get_or_create和update_or_create 的作用和使用

Django get_or_create和update_or_create 的作用和使用:

get_or_createupdate_or_create 是 Django 中的两个有用的方法,用于在数据库中获取或创建记录。如果记录不存在,则创建它们;如果存在,则返回现有记录。这两个方法帮助简化了避免重复记录的逻辑,并提供了一种简洁的方法来更新或创建记录。

get_or_create

get_or_create 方法尝试在数据库中获取一个对象,如果该对象不存在,则创建一个新对象。返回一个二元组,其中包含对象和一个布尔值,指示对象是否已创建。

使用示例

复制代码
from myapp.models import MyModel

# 定义查找条件和默认值
lookup = {'field1': 'value1', 'field2': 'value2'}
defaults = {'field3': 'default3', 'field4': 'default4'}

# 获取或创建对象
obj, created = MyModel.objects.get_or_create(defaults=defaults, **lookup)

if created:
    print('New object created.')
else:
    print('Object already exists.')
复制代码

在这个示例中,get_or_create 方法会尝试查找满足 field1='value1'field2='value2' 的对象。如果找不到,则使用提供的默认值 field3='default3'field4='default4' 创建一个新对象。

update_or_create

update_or_create 方法类似于 get_or_create,但在对象存在时会更新它。它也返回一个二元组,其中包含对象和一个布尔值,指示对象是否已创建。

使用示例

复制代码
from myapp.models import MyModel

# 定义查找条件和更新值
lookup = {'field1': 'value1', 'field2': 'value2'}
defaults = {'field3': 'new_value3', 'field4': 'new_value4'}

# 更新或创建对象
obj, created = MyModel.objects.update_or_create(defaults=defaults, **lookup)

if created:
    print('New object created.')
else:
    print('Existing object updated.')
复制代码

在这个示例中,update_or_create 方法会尝试查找满足 field1='value1'field2='value2' 的对象。如果找到对象,它将使用提供的默认值 field3='new_value3'field4='new_value4' 更新它。如果找不到对象,则创建一个新对象。

使用场景

  • get_or_create:当您希望确保在数据库中存在唯一对象时使用。如果对象存在,则返回它;如果不存在,则创建它。
  • update_or_create:当您希望确保对象存在并且在必要时进行更新时使用。如果对象存在,则更新它;如果不存在,则创建它。

结合使用 get_or_createupdate_or_create

在实际应用中,可以将 get_or_createupdate_or_create 结合使用,以确保不存在重复的外键记录,同时在主要记录中进行更新。例如:

复制代码
qs = TestData.objects.filter()
for i in qs:
    # 获取或创建 FactoryProduct 实例
    item, item_created = FactoryProduct.objects.get_or_create(
        item_no=i.item_no,
        defaults={
            # 在这里添加 FactoryProduct 的其他字段默认值
        }
    )

    # 获取或创建 ProductBox 实例
    box, box_created = ProductBox.objects.get_or_create(
        box_code=i.box_code,
        defaults={
            # 在这里添加 ProductBox 的其他字段默认值
        }
    )

    # 获取或创建 ProductPallet 实例
    pallet, pallet_created = ProductPallet.objects.get_or_create(
        pallet_code=i.pallet_code,
        defaults={
            # 在这里添加 ProductPallet 的其他字段默认值
        }
    )

    # 获取或创建 Customer 实例
    customer, customer_created = Customer.objects.get_or_create(
        cu_no=i.cu_no,
        defaults={
            # 在这里添加 Customer 的其他字段默认值
        }
    )

    # 新增或更新 ProductPackage 实例
    obj, created = ProductPackage.objects.update_or_create(
        item_no=item,
        box_code=box,
        pallet_code=pallet,
        defaults={
            'box_product_qty': i.box_product_qty,
            'pallet_boxes_layer': i.pallet_boxes_layer,
            'pallet_max_layers': i.pallet_max_layers,
            'pallet_other_weight': i.pallet_other_weight,
            'rmk': '批次导入',
            'cu_no': customer,
            'state': True
        }
    )

    if created:
        print(f"Created a new ProductPackage instance for item_no: {i.item_no}.")
    else:
        print(f"Updated the existing ProductPackage instance for item_no: {i.item_no}.")
复制代码

通过这种方法,您可以确保所有相关外键记录存在,并且在必要时创建新的主记录或更新现有记录。

在这段代码中:

  • 我们使用 get_or_create 方法在 FactoryProductProductBoxProductPalletCustomer 模型中查找记录。如果记录不存在,则会创建一条新记录。
  • 接下来使用 update_or_create 方法在 ProductPackage 模型中新增或更新记录。
  • 我们还可以添加一些 defaults 参数来为新记录提供默认值,这些值可以根据您的实际需求进行设置。
posted @   侬侬发  阅读(592)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示