首页 > 其他分享 >Django get_or_create和update_or_create 的作用和使用

Django get_or_create和update_or_create 的作用和使用

时间:2024-07-25 10:51:36浏览次数:8  
标签:created create get update pallet defaults

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 参数来为新记录提供默认值,这些值可以根据您的实际需求进行设置。

标签:created,create,get,update,pallet,defaults
From: https://www.cnblogs.com/beichengshiqiao/p/18322515

相关文章

  • Python 中 __get__ 方法的内部原理
    我正在摆弄描述符,结果碰壁了。我以为我可以像使用任何其他方法一样直接调用它,但显然,它似乎不一致或者我遗漏了一些东西。假设我有一个用作描述符的坐标类:|||还有一个Point类,它有2个坐标属性:classCoordinate:def__set_name__(self,owner,name):self._na......
  • 在 python requests modul 中,如何检查页面是否使用“POST”方法或“GET”方法
    如何使用python“requests”模块检查页面是否使用“GET”方法或“POST”方法。我期望输出为True或False,或者GET或Post预期代码:importrequestsurl=f"www.get_example.com"response=requests.get(url)ifresponse.check_get==True:print("get")你......
  • Vue全家桶 - pinia 的理解和学习1(Pinia 核心概念的 Store、State、Getter、Action)
    Pinia(Vue的专属状态管理库)Pinia和Vuex的区别设计理念和架构Vuex采用集中式架构,所有状态存储在一个全局状态树中,通过mutations和actions来修改和处理状态。Pinia采用去中心化的架构,每个模块有自己的状态,这使得Pinia在代码分割和模块化方面更加灵活。TypeSc......
  • Ubuntu中如何使用Update-rc.d命令(转)
    在Ubuntu中,update-rc.d命令用于管理系统的服务(init脚本)的启动和停止顺序。它允许你将服务添加到特定的运行级别,并设置服务在系统启动时是否自动启动。以下是一些常用的update-rc.d命令示例及其说明:添加服务到特定运行级别:sudo update-rc.d  defaults将指定的服务添加到默认......
  • Linux获取线程调度策略pthread_attr_getschedpolicy
    thread_attr_getschedpolicy 函数是POSIX线程(pthread)库中用于获取线程属性对象中的调度策略的函数。在实时系统中,调度策略决定了线程如何被调度器选择来执行。pthread_attr_getschedpolicy 函数允许你查询一个已创建的线程属性对象(pthread_attr_t 类型)中设置的调度策略......
  • Failed to create JVM.JVM Path:D:\IntelliJ IDEA 2024.1.4\jbr Error launching I
     IDEA修改启动参数掉大坑!情况说明:在Help>EditCustom VMOptions修改IDEA的VM产生之后无法打开(重启/重装多次依然无法打开),修改C盘的idea64.exe.vmoptions和安装目录的idea64.exe.vmoptions依然无法启动!,后面把IDEA安装目录的jar文件夹删了,又重装JDK。由于我有多个JDK环境,......
  • QListWidget实现内部拖动排序功能
    1.需求将QListWidget有很多的任务,需要拖动任务,手动进行排序,并且需要保存拖动之后的顺序,软件重新打开要是修改之后的顺序;(1)继承QListWidget,重写一个QListWidget自定义类#ifndefDROPLISTWIDGET_H#defineDROPLISTWIDGET_H#include<QListWidget>#include<QDropEvent>clas......
  • Warning formula.jws.json update failed, falling back to cached version
    Warning:formula.jws.json:updatefailed,fallingbacktocachedversion.MacOS执行服务启动命令时,显示下载失败警告,导致无法启动服务MacBook-Pro~%brewservicesstartnginx==>Downloadinghttps://formulae.brew.sh/api/formula.jws.json########......
  • 如何通过 BAPI_SALESORDER_CREATEFROMDAT2 批量创建多个销售订单
    准备工作:准备数据结构:首先,你需要为每个销售订单准备一个数据集,这可以是一个内部表(在ABAP程序中)或一个外部数据源(如数据库表或Excel文件)。循环处理:遍历你的数据集,对于每个销售订单数据,创建相应的数据结构并填充必要的字段。调用BAPI:对于每个填充好数据的订单,调用一......
  • 为什么 Runtime.getRuntime().exec 在 Tomcat 中以 root 身份分叉进程?
    我正在使用Runtime.getRuntime().exec(...)从Tomcatweb应用程序中执行python脚本。当我在我的开发环境中时一切都很顺利(Eclipse通过Sysdeo-Plugin运行我的本地Tomcat(位于/home/me/opt/tomcat))。当我在生产环境(=DebianSqueeze)中运行我的web应用程序时,会出现此问题......