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

/ DoesNotExist / Userdata匹配查询不存在。DJango问题

问题概述

DoesNotExist 是 Django 框架中常见的异常之一,通常在尝试获取数据库中不存在的对象时抛出。例如,在执行用户数据匹配查询时,如果查询条件没有匹配到任何记录,Django 会抛出 User.DoesNotExist 异常。

基础概念

  • Django ORM:Django 的对象关系映射(ORM)系统允许开发者使用 Python 类来表示数据库表,并通过这些类进行数据库操作。
  • 查询集(QuerySet):Django ORM 使用 QuerySet 来表示数据库查询的结果。QuerySet 是惰性的,只有在需要时才会执行查询。
  • 异常处理:在 Python 中,异常用于处理运行时错误。DoesNotExist 是 Django 提供的一个自定义异常,用于处理对象不存在的情况。

相关优势

  • 简化数据库操作:Django ORM 提供了高级的抽象,使得开发者可以用 Python 代码而不是 SQL 语句来操作数据库。
  • 安全性:ORM 可以防止 SQL 注入等安全问题,因为它会自动转义用户输入。
  • 一致性:通过 ORM,数据库操作的一致性得到了保证,因为所有的数据库操作都是通过 Django 的模型层进行的。

类型

  • 模型层异常:如 DoesNotExistMultipleObjectsReturned
  • 数据库层异常:如 IntegrityErrorOperationalError

应用场景

  • 用户认证:在用户登录时,检查用户名和密码是否匹配。
  • 数据检索:从数据库中检索特定条件的数据。
  • 数据更新:更新数据库中的记录。

常见问题及解决方法

问题:为什么会出现 DoesNotExist 异常?

原因

  • 查询条件不正确,导致没有匹配到任何记录。
  • 数据库中确实不存在符合条件的记录。

解决方法

  1. 检查查询条件:确保查询条件正确无误。
  2. 异常处理:使用 try-except 块捕获 DoesNotExist 异常,并进行相应的处理。
代码语言:txt
复制
from django.core.exceptions import ObjectDoesNotExist
from myapp.models import User

try:
    user = User.objects.get(username='example_user')
except ObjectDoesNotExist:
    print("User does not exist")
  1. 默认值:在查询不到数据时,返回一个默认值。
代码语言:txt
复制
user = User.objects.filter(username='example_user').first()
if user is None:
    user = User()  # 或者其他默认值

问题:如何避免 DoesNotExist 异常?

解决方法

  1. 使用 filter 方法filter 方法返回一个 QuerySet,即使没有匹配到记录也不会抛出异常。
代码语言:txt
复制
users = User.objects.filter(username='example_user')
if users.exists():
    user = users.first()
else:
    print("User does not exist")
  1. 使用 get_or_create 方法:如果记录不存在,则创建一个新的记录。
代码语言:txt
复制
user, created = User.objects.get_or_create(username='example_user')
if created:
    print("User created")
else:
    print("User already exists")

参考链接

通过以上方法,可以有效地处理和避免 DoesNotExist 异常,确保 Django 应用的稳定性和可靠性。

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

相关·内容

django ObjectDoesNotExist 和 DoesNotExist的用法

例1: from django.core.exceptions import ObjectDoesNotExist try: pe = Plant.objects.get(id=12873) except...ObjectDoesNotExist: print "uuuu" uuuu # 我随意找了一个id=12873的对象来查询,当然,数据库里没有这个id,可以看到结果正常的打印出来 例2: try:...补充知识:Django入门:DoesNotExist: User matching query does not exist....,如果搜索username的值等于“sss”时,其返回正确的结果,但如果搜索中不存在“sss”时,会返回如标题的错误(DoesNotExist: User matching query does not...由此问题可以延伸到:遇到同类问题可以怎么解决: 可以使用try…except…语句将可能会导致程序终止的语句包涵其中,具体写法如下: try: User.objects.filter(username

1.6K30
  • Django之model查select的用法

    ,year,相同用法的还有匹配月month,匹配日day,匹配周week_day,匹配时hour,匹配分minute,匹配秒second User.objects.filter(create_time_...,程序将会抛出一个错误 abcer.models.DoesNotExist: User matching query does not exist....方法,如果查询的对象不存在的话,则抛出一个Http404的异常 实现方法类似于下边这样: from django.http import Http404 try: _t = User.objects.get...(id=724) except User.DoesNotExist: raise Http404 get_or_create 顾名思义,查找一个对象如果不存在则创建,如下: object, created...中能用ORM的就用它ORM吧,不建议执行原生SQL,可能会有一些安全问题,如果实在是SQL太复杂ORM实现不了,那就看看下边执行原生SQL的方法,跟直接使用pymysql基本一致了 from django.db

    75440

    Django model select的各种用法详解

    Django model update的各种用法介绍》文章介绍了Django model的各种update操作,这篇文章就是她的姊妹篇,详细介绍Django model select的用法,配以对应...,程序将会抛出一个错误 abcer.models.DoesNotExist: User matching query does not exist....方法,如果查询的对象不存在的话,则抛出一个Http404的异常 实现方法类似于下边这样: from django.http import Http404 try: _t = User.objects.get...(id=724) except User.DoesNotExist: raise Http404 get_or_create 顾名思义,查找一个对象如果不存在则创建,如下: object, created...中能用ORM的就用它ORM吧,不建议执行原生SQL,可能会有一些安全问题,如果实在是SQL太复杂ORM实现不了,那就看看下边执行原生SQL的方法,跟直接使用pymysql基本一致了 from django.db

    1.1K30

    Python的Django框架实现数据库查询(不返回QuerySet的方法)

    queryset中是否有对象 aggregate() 聚合操作 in_bulk() 根据主键值的列表,批量返回对象 iterator() 获取包含对象的迭代器 三、以上方法的使用: 1.get()方法: 返回按照查询参数匹配到的单个对象...,若匹配到的对象个数不只一个的话,会触发MultipleObjectsReturned异常,若根据参数匹配不到对象的时候,会触发DoesNotExist异常。...获取参数失败栗子: # 使用get()方法获取一条不存在的数据 user_obj = models.User.objects.get(mobile=13888888888) # 抛出异常: DoesNotExist...使用ObjectDoesNotExist异常栗子: DoesNotExist异常从django.core.exceptions.ObjectDoesNotExist继承,可以定位多个DoesNotExist...以上这篇Python的Django框架实现数据库查询(不返回QuerySet的方法)就是小编分享给大家的全部内容了,希望能给大家一个参考。

    2.6K30

    Django】基于PythonWeb的Django框架设计实现天天生鲜系统-5数据库操作

    此时进入 shell, 我们可在 shell 中通过面向对象方式对数据库中的数据进行 CRUD 操作. 1 插入操作 在 Django 中我们不需要编写一行 SQL 语句, 就可以对数据库中的数据进行操作...如果匹配到的对象个数不只一个的话,get 将会触发 MultipleObjectsReturned 异常. MultipleObjectsReturned 异常是模型类的属性....如果根据给出的参数匹配不到对象的话, 将触发DoesNotExist 异常. 这个异常是模型类的属性. all 方法: 获取一个表中所有对象的最简单的方式是全部获取。...3 更新操作 Django 创建和更新对象,使用同一个函数save()....当调用save()时, django会判断对象是否有主键,如果存在则调用更新,如果不存在则创建数据. cag = GoodsCategory.objects.get(id=1) cag.cag_name

    48620

    【愚公系列】2022年01月 Python教学课程 42-Django框架之ORM中查询详解

    文章目录 一、基础条件查询 1.基本查询 2.过滤查询 3.F和Q对象 4.聚合函数和排序函数 5.关联查询 6.查询集QuerySet ---- 一、基础条件查询 1.基本查询 get查询单一结果,如果不存在会抛出模型类....DoesNotExist异常。...QuerySet 1 概念 Django的ORM中存在查询集的概念。...使用同一个查询集,第一次使用时会发生数据库的查询,然后Django会把结果缓存下来,再次使用这个查询集时会使用缓存的数据,减少了数据库的查询次数。...如果获取一个对象,直接使用[0],等同于[0:1].get(),但是如果没有数据,[0]引发IndexError异常,[0:1].get()如果没有数据引发DoesNotExist异常。

    1.9K40

    Django 模型成员2.2

    类的属性 objects:是Manager类型的对象,用于与数据库进行交互 当定义模型类时没有指定管理器,则Django会为模型类提供一个名为objects的管理器 支持明确指定模型类的管理器 class...books = models.Manager() 当为模型类指定管理器后,django不再为模型类生成名为objects的默认管理器 管理器Manager 管理器是Django的模型进行数据库的查询操作的接口...,Django应用的每个模型都拥有至少一个管理器 自定义管理器类主要用于两种情况 情况一:向管理器类中添加额外的方法:见下面“创建对象”中的方式二 情况二:修改管理器返回的原始查询集:重写get_queryset...books = BookInfoManager() 调用:book=Book.books.create_book("abc",datetime(1980,1,1)) 查看:book.pk 实例的属性 DoesNotExist...:在进行单个查询时,模型的对象不存在时会引发此异常,结合try/except使用 实例的方法 str (self):重写object方法,此方法在将对象转换成字符串时会被调用 save():将模型对象保存到数据表中

    51340

    Django实战-生鲜电商-用户地址|订单确认

    在完成登录到用户提交订单,这一系列的类视图函数,会发现有大量的数据读写操作,像电商这类的项目,更多的是用户在浏览页面的次数比较多,所以在数据查询的场景中都会采用缓存,将用户第一次打开页面,到下一次重新浏览...一、用户地址 用户地址的类视图,包括用户查询地址,也可以让用户创建新的收货地址。 在进入该视图之前,需要先验证用户是否登录,继承 LoginRequiredMinxin 类。...: # 如果地址信息不存在 address = None context = { # "user": user,...# django的模板中可以直接使用user模板变量 "address": address } return render(request,...total_count = 0 total_skus_amount = 0 trans_cost = 10 # 邮费,暂时写死 # 查询商品数据

    63020

    Django 模型查询2.3

    filter(键1=值1,键2=值2) 等价于 filter(键1=值1).filter(键2=值2) 返回单个值的方法 get():返回单个满足条件的对象 如果未找到会引发"模型类.DoesNotExist...,不会立即执行查询 如果获取一个对象,直接使用[0],等同于[0:1].get(),但是如果没有数据,[0]引发IndexError异常,[0:1].get()引发DoesNotExist异常 查询集的缓存...每个查询集都包含一个缓存来最小化对数据库的访问 在新建的查询集中,缓存为空,首次对查询集求值时,会发生数据库查询django会将查询的结果存在查询集的缓存中,并返回请求的结果,接下来对查询集求值将重用缓存的结果...()、get()的参数 语法:属性名称__比较运算符=值 表示两个下划线,左侧是属性名称,右侧是比较类型 对于外键,使用“属性名_id”表示外键的原始值 转义:like语句中使用了%与,匹配数据中的%与...,会合并为And进行 需要进行or查询,使用Q()对象 Q对象(django.db.models.Q)用于封装一组关键字参数,这些关键字参数与“比较运算符”中的相同 from django.db.models

    2.4K20
    领券