首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

django - get_or_create问题 - 导致在DB中创建两个对象

在Django中,get_or_create是一个常用的方法,用于在数据库中查找具有特定属性的对象,如果找不到,则创建一个新的对象。这个方法可以帮助避免在数据库中创建重复的对象。

在使用get_or_create方法时,可能会遇到在数据库中创建两个对象的问题。这通常是由于并发操作导致的。在多线程或多进程的环境中,两个或多个线程或进程可能同时查找数据库中的对象,并在找不到对象时同时创建新的对象。这可能导致在数据库中创建多个具有相同属性的对象。

为了解决这个问题,可以使用Django的select_for_update方法来锁定已经找到的对象,以防止其他线程或进程同时创建新的对象。这可以通过以下代码实现:

代码语言:python
代码运行次数:0
复制
from django.db import transaction
from myapp.models import MyModel

@transaction.atomic
def get_or_create_my_model():
    obj, created = MyModel.objects.select_for_update().get_or_create(**kwargs)
    if created:
        obj.save()
    return obj, created

在上面的代码中,我们使用了@transaction.atomic装饰器来确保在整个事务中执行的操作是原子性的。然后,我们使用select_for_update方法来锁定已经找到的对象,以防止其他线程或进程同时创建新的对象。这可以确保在并发环境中,get_or_create方法只会创建一个新的对象。

总之,get_or_create方法是一个非常有用的方法,可以帮助开发人员避免在数据库中创建重复的对象。但是,在并发环境中,需要注意使用select_for_update方法来锁定已经找到的对象,以防止其他线程或进程同时创建新的对象。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Django之QuerySet详解

最后建议只Django视图的POST请求中使用get_or_create(),因为这是一个具有修改性质的动作,不应该使用在GET请求,那样不安全。...可以通过ManyToManyField属性和反向关联使用get_or_create()。在这种情况下,应该限制查询关联的上下文内部。 否则,可能导致完整性问题。...Django1.11defaults增加了对可调用值的支持。...和get_or_create()一样,这个方法也容易导致竞态条件,如果数据库层级没有前置唯一性会让多行同时插入。 Django1.11defaults增加了对可调用值的支持。...batch_size参数控制单个查询创建对象数。 6. count() 返回在数据库对应的QuerySet对象的个数。count()永远不会引发异常。 # 返回总个数.

2.3K20
  • Django学习之旅(六)

    我新建一个名为 Django_demo 的项目,根目录有个名为 db 的 SQLite 数据库。 ?...3 创建字段 models.py 文件,我们新建一个实体类,代码如下: ? 上述代码非常直观。每个模型都用一个类表示,该类继承自 django.db.models.Model。...当我们 model.py 对这两个模型类修改完成之后,我们需要通知数据库:“我模型已经修改了,你数据库也要更新呀”。 只需要执行上步的两行命令即可 ?...Django 会对 models.py 进行检测,自动发现需要更改的,应用到数据库中去。 1)创建对象 打开 python 终端,利用命令行来创建一个对象。 ?...4)使用 QuerySet 创建数据 我们之前创建对象都是通过命令行。但是在生产环境,显然不能这么操作。那么我们要如何在 py 文件创建对象呢?

    1.4K30

    Django笔记(十一)实现对数据库的各种操作,比如分组,排序等

    ) # asc # models.Tb1.objects.filter(name='seven').order_by('-id') # desc 分组 annotate 聚合函数 from django.db.models...`category_id` ORDER BY NULL aggregate 聚合函数 整个表进行分组 from django.db.models import Count, Min, Max,...Article.objects.exclude(id=1) F() 我们在做更新的时候,获取上一次的值 比如我们想要将一个字段的值加一,不需要每一次都拿出来加一之后再保存,可以这样写 # from django.db.models...# # from django.db import connection, connections # cursor = connection.cursor() 这个是默认的数据源...获取每行数据为字典格式 values_list() 获取每行数据为元祖 获取每行数据为元祖 bulk_create()批量创建数据 get_or_create() # 如果存在,则获取,否则

    89410

    Django ORM 知识概要

    Django带的migrations数据表更改数据库记录 字段 常用的字段 自增长字段 models.AutoField() models.BigAutoField() 二进制数据 models.BinaryField...删除Django的migrations表对应的记录 删除数据库表 导入数据 Django shell 导入数据 引入模型 调用模型对象的save方法 自己定义一个脚本批量导入数据 fixtures...get(),get_or_create(),first(),last(),latest(),earliest(),in_bulk() 创建对象 create(),bulk_create(),create_or_update...() 创建,批量创建创建或更新 更新对象 update(),update_or_create() 更新,更新或创建 删除对象 delete() 使用filter 过滤 其它操作 exists(),count...(),aggregate() 判断是否存在,统计个数,聚合 aggregate() 是对这个数据表的数据进行统计 自定义聚合查询 F对象和Q对象 F对象:操作字段的数据 Q对象:结合 AND ,

    1.8K20

    Django学习笔记之Django QuerySet的方法

    一般情况下,我们Django项目需要操作QuerySet时一些常用的方法已经满足我们日常大多数需求,比如get、filter、exclude、delete神马的感觉就已经无所不能了,但随着项目但业务逻辑越来越复杂...args, *kwargs) 这个参数有点像annotate的反义,annotate返回的是一个包含注解值的queryset,而aggregate则单独返回注解值,返回类型是一个dict,当然,这种方式文档叫做聚合查询...Entry.objects.defer('time', 'black') 当你使用链式方法调用only时只有最后一个only内的参数会立即返回,其他参数都会被defer,注意这里only的覆盖性~ 5、create(**kwargs) 创建并保存对象...(kwargs) 嗯,看看就知道这个是create的升级版,没错,他们俩一个是查无此数据后新建一个是更新不存在数据时新建,具体用法同create,get_or_create等效如下过程 try:...,他们返回两个东东: created, obj = get_or_create(**kwargs) 其中created是个bool值,当此方法生成了一个新的model object,此值为True,反之为

    58650

    Django(19)QuerySet API

    其实模型名字.objects是一个django.db.models.manager.Manager对象,而Manager这个类是一个“空壳”的类,他本身是没有任何的属性和方法的。...这个方法是为了解决多对一和多对多的关系的查询问题。...所以这个方法获取数据,只能有且只有一条。 create create:创建一条数据,并且保存到数据库。这个方法相当于先用指定的模型创建一个对象,然后再调用这个对象的save方法。...get_or_create:根据某个条件进行查找,如果找到了那么就返回这条数据,如果没有查找到,那么就创建一个。...Django将QuerySet转换为SQL语句去执行的五种情况 迭代:遍历QuerySet对象的时候,会首先先执行这个SQL语句,然后再把这个结果返回进行迭代。

    73010

    Django之model查select的用法

    fullname') # filter单列、查询单列,正常values_list给出的结果是个列表,里边里边的每条数据对应一个元组,当只查询一列时,可以使用flat标签去掉元组,将每条数据的结果以字符串的形式存储列表...(id=724) except User.DoesNotExist: raise Http404 get_or_create 顾名思义,查找一个对象如果不存在则创建,如下: object, created...= User.objects.get_or_create(username='运维咖啡吧') 返回一个由object和created组成的元组,其中object就是一个查询到的或者是被创建对象,created...是一个表示是否创建了新对象的布尔值 实现方式类似于下边这样: try: object = User.objects.get(username='运维咖啡吧') created = False...能用ORM的就用它ORM吧,不建议执行原生SQL,可能会有一些安全问题,如果实在是SQL太复杂ORM实现不了,那就看看下边执行原生SQL的方法,跟直接使用pymysql基本一致了 from django.db

    75840

    Python:轻量级 ORM 框架 peewee 用法详解

    下文中不再特意说明这个问题,大家看代码。...说明: 1、当 rows 传递的是字典列表时,fields 是不需要传的,如果传了,那么,rows 的字段字典必须存在,否则报错。...Person.get_by_id(1) 4、get_or_create Peewee 有一个辅助方法来执行“获取/创建”类型的操作: Model.get_or_create() 首先尝试检索匹配的行。...对于“创建或获取”类型逻辑,通常会依赖唯一 约束或主键来防止创建重复对象。但这并不是强制的,比如例子,我以 Name 为条件,而 Name 并非主键。只是最好不要这样做。...返回值: get_or_create 方法有两个返回值,第一个是“获取/创建”的模型实例,第二个是是否新创建。 5、select 使用 Model.select() 查询获取多条数据。

    5.8K20

    python 终级篇 django --

    此时可以使用distinct(),注意只有PostgreSQL中支持按字段去重。) count(): 返回数据库匹配查询(QuerySet)的对象数量。...方法: create() 创建一个新的对象,保存对象,并将它添加到关联对象集之中,返回新创建对象。...用到的内置函数: from django.db.models import Avg, Sum, Max, Min, Count 示例: >>> from django.db.models import...如果我们要对两个字段的值做比较,那该怎么做呢? Django 提供 F() 来做这样的比较。F() 的实例可以查询引用字段,来比较同一个 model 实例两个不同字段的值。...终端打印SQL语句              Django项目的settings.py文件最后复制粘贴如下代码: LOGGING = { 'version': 1, 'disable_existing_loggers

    2.9K20

    Django 使用 ORM 操作数据库详解

    python的一个默认的编写规范是一切皆对象,这样做使得代码简洁,结构清晰,便于维护和重用代码,同时极大的提升开发效率。...同样操作数据库时,一般我们用SQL语句来实现操作,但是放在Python是一串冗长的字符串,不利于调试和修改,更不符合上面提到的规范。...无法实现某些复杂操作 遗忘SQL语句编写 怎么选择原生SQL和ORM 对于复杂的SQL语句或数据库层面,推荐使用原始SQL 对于要处理复杂的业务逻辑,加快开发,推荐使用ORM ORM 相对 原始SQL一般的业务...coding: utf-8 -*- # @Author : Baimoc # @Email : baimoc@163.com # @Time : 2020/7/24 9:45 from django.db...数据库的数据表 ? 2. 脚本添加 #!

    78020

    Django model select的各种用法详解

    fullname') # filter单列、查询单列,正常values_list给出的结果是个列表,里边里边的每条数据对应一个元组,当只查询一列时,可以使用flat标签去掉元组,将每条数据的结果以字符串的形式存储列表...(id=724) except User.DoesNotExist: raise Http404 get_or_create 顾名思义,查找一个对象如果不存在则创建,如下: object, created...= User.objects.get_or_create(username='运维咖啡吧') 返回一个由object和created组成的元组,其中object就是一个查询到的或者是被创建对象,created...是一个表示是否创建了新对象的布尔值 实现方式类似于下边这样: try: object = User.objects.get(username='运维咖啡吧') created = False...能用ORM的就用它ORM吧,不建议执行原生SQL,可能会有一些安全问题,如果实在是SQL太复杂ORM实现不了,那就看看下边执行原生SQL的方法,跟直接使用pymysql基本一致了 from django.db

    1.1K30

    DjangoDjango ORM 学习笔记

    ORM 的最令人诟病的地方就是性能问题,不过现在已经提高了很多,下面是 ORM 的几个缺点 性能问题 自动化进行数据库关系的映射需要消耗系统资源 程序员编码 处理多表联查、where 条件复杂的查询时...对象和关系之间并不是完美映射 一般来说 ORM 足以满足我们的需求,如果对性能要求特别高或者查询十分复杂,可以考虑使用原生 SQL 和 ORM 共用的方式 Django ORM Django 框架中集成了...Manager 创建完 Model 对象之后,Django 会自动为其关联一个 Manager 对象,该对象是 Model 进行数据库操作的接口。...如果在查询关联对象时需要使用查询条件,可以使用 Prefetch 对象,下面是一个示例: from django.db.models import Prefetch authors = Author.objects.prefetch_related...aggregate: 针对所有记录调用聚合函数,返回一个 dict 对象,下面是使用示例: from django.db.models import Min from django.db.models

    2.2K20

    Django学习笔记之ORM字段和字段参数

    ORM的优势 ORM解决的主要问题对象和关系的映射。它通常把一个类和一个表一一对应,类的每个实例对应表的一条记录,类的每个属性对应表的每个字段。 ...但我们不能指望某个工具能一劳永逸地解决所有问题,一些特殊问题还是需要特殊处理的。 但是整个软件开发过程需要特殊处理的情况应该都是很少的,否则所谓的工具也就失去了它存在的意义。...Django项目的settings.py文件,配置数据库连接信息: DATABASES = { "default": { "ENGINE": "django.db.backends.mysql...Model Djangomodel是你数据的单一、明确的信息来源。它包含了你存储的数据的重要字段和行为。...=True, # 是否在数据库创建外键约束 db_table=None, # 默认创建第三张表时,数据库中表的名称 10.

    5.1K10

    可重复读事务隔离级别之 django 解读

    本文尝试结合django解释应用开发并发访问数据库可能会遇到的可重复读引起的问题,希望能帮助大家开发过程中有效避免类似问题,如果老版本应用中出现这类问题也可以快速定位。...由于django1.3(由于历史原因,目前蓝鲸体系内大多数稳定运营的工具系统用的是django1.3)问题最为严重,本文先对django1.3环境的一个应用案例进行分析,说明问题产生的具体原因,然后说明如何有效避免类似问题...先看下如下这段代码django1.3会有什么问题: class MyData(models.Model): key = models.CharField(primary_key=True,...django1.3的确是这样,因为这个问题django1.3的cache框架就被提交了Bug,django1.3遵循的是PEP 249Python数据库API 规范v2.0, 需要将autocommit...最后,django1.8只是将这种可重复读引起问题的概率降低了很多,如果我们事务处理不当,也会引起类似问题django本文最开始的例子进行稍微调整,django1.8运行一样会报错。

    1.8K00
    领券