Django get_or_create和update_or_create 的作用和使用:
get_or_create
和 update_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_create
和 update_or_create
在实际应用中,可以将 get_or_create
和 update_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
方法在FactoryProduct
、ProductBox
、ProductPallet
和Customer
模型中查找记录。如果记录不存在,则会创建一条新记录。 - 接下来使用
update_or_create
方法在ProductPackage
模型中新增或更新记录。 - 我们还可以添加一些
defaults
参数来为新记录提供默认值,这些值可以根据您的实际需求进行设置。