首页 > 其他分享 >Django ORM非空判断、以及通用写法

Django ORM非空判断、以及通用写法

时间:2024-06-15 09:01:33浏览次数:12  
标签:非空 name objects models MyModel Django ORM address ar

django文档

Django ORM中,判断非空(not null)有多种方式,

使用isnull查询方法

# 查找所有name字段不为空的对象
objects = MyModel.objects.filter(name__isnull=False)

使用exclude方法排除空值:

# 查找所有name字段不为空的对象
objects = MyModel.objects.exclude(name__isnull=True)

使用blank=False和null=False设置字段属性

from django.db import models

class MyModel(models.Model):
    name = models.CharField(max_length=100, blank=False, null=False)
    # 这样定义的name字段在数据库中不允许为空

在Model方法中进行判断

class MyModel(models.Model):
    name = models.CharField(max_length=100)

    def is_name_not_null(self):
        return self.name is not None

使用clean方法进行验证

from django.core.exceptions import ValidationError

class MyModel(models.Model):
    name = models.CharField(max_length=100)

    def clean(self):
        if self.name is None:
            raise ValidationError({'name': 'Name cannot be null.'})

这些方法各有优缺点,具体使用时需要根据具体的业务需求和使用场景进行选择。比如在查询时使用isnull或exclude方法更加简单高效,而在Model中设置字段属性或重写clean方法可以在保存时进行更复杂的验证。

通用写法

在Django ORM中,通过表达式来判断字段是否为空是非常常见的需求。您提到的ar_address__isnull=True是一个具体的例子,那么如何编写更通用的表达式来实现这种判断呢?

使用 Q 对象:


from django.db.models import Q

# 判断 ar_address 字段是否为空
qs = MyModel.objects.filter(Q(ar_address__isnull=True))

Q 对象可以用于构建复杂的查询条件,这种方式更加灵活。

使用 IsNull 表达式:

from django.db.models import IsNull

# 判断 ar_address 字段是否为空
qs = MyModel.objects.filter(IsNull('ar_address'))

IsNull 表达式也可以用于判断字段是否为空。

使用 Case 和 When 表达式

from django.db.models import Case, When, BooleanField

# 判断 ar_address 字段是否为空
qs = MyModel.objects.annotate(
    is_ar_address_null=Case(
        When(ar_address__isnull=True, then=True),
        default=False,
        output_field=BooleanField()
    )
)

这种方式可以将判断结果作为一个新的字段添加到查询集中,方便后续的处理。

使用自定义的函数


def is_field_null(field_name):
    return Q(**{f"{field_name}__isnull": True})

# 判断 ar_address 字段是否为空
qs = MyModel.objects.filter(is_field_null('ar_address'))

自定义一个通用的函数,可以更方便地复用这种判断逻辑。

标签:非空,name,objects,models,MyModel,Django,ORM,address,ar
From: https://blog.csdn.net/qq_42691309/article/details/139683777

相关文章

  • Akshay解释Transformer的六张图
    LightningAI的首席数据科学家Akshay(https://x.com/akshay_pachaar)做了六张图解释Transformer,相当清晰明了。一、Embeddings(词嵌入)词嵌入是使用一组数字对每个token(大约一个词)进行有意义的表示。这种嵌入是我们作为语言模型的输入提供的,即下面过程:原始文本→Tokenization......
  • jquery.form.js(ajax表单提交)
    参考代码:$("form").submit(function(){$(this).ajaxSubmit({url:"login",//设置提交的url,可覆盖action属性target:"#box",//服务器返回的内容存放在#box里type:"GET",dateTy......
  • 【开源样本库分享】Five-Billion-Pixels-ENVIFormat 五十亿像素高精度样本库分享
    很高兴给大家分享一个好消息,Five-Billion-Pixels-ENVIFormat五十亿像素开源样本库(ENVI格式)正式上线了!Five-Billion-Pixels样本库是一个为遥感、地理信息系统(GIS)和图像处理领域的研究和应用而精心打造的高质量样本库。为了让更多的人受益,我们决定制作并发布ENVI格式的五十亿像素......
  • WinForm窗口水印
    先上效果图 参考代码分享:给窗体添加水印-陈恩点-博客园(cnblogs.com)WinForm添加水印-白衣如花-博客园思路使用透明无框窗体覆盖需要添加水印的窗体,并设置owner为主窗体。然后在透明窗体绘制水印文本即可。代码1publicclassWatermark2{3pr......
  • 【Go】用 Go 原生以及 Gorm 读取 SQLCipher 加密数据库
    本文档主要描述通过https://github.com/mutecomm/go-sqlcipher生成和读取SQLCipher加密数据库以及其中踩的一些坑用go去生成读取SQLCipher数据库用gorm去读取SQLCipher数据库在生成后分别用DBeaver、dbbrowser和sqlcipher读取SQLCipher数据库,基础操作见......
  • 显著性目标检测(弱监督):Mutual Information Regularization for Weakly-supervised
    文章地址:MutualInformationRegularizationforWeakly-SupervisedRGB-DSalientObjectDetection|IEEEJournals&Magazine|IEEEXplore摘要:1.引入一个信息上界和一个互信息最小化正则项,鼓励每个模态的解纠缠表示用于SOD;2.运用非对称的特征提取器;3.引入多模态的......
  • FastAPI-7:框架比较(Flask、Django及FastAPI)
    7框架比较(Flask、Django及FastAPI)关于一个新的Web框架,您可能想知道的第一件事就是如何入门,而一种自上而下的方法就是定义路由(从URL和HTTP方法到函数的映射)。7.1FlaskFlask自称是微框架。它提供基本功能,你可以根据需要下载第三方软件包进行补充。它比Django小,入门时学习......
  • Angular Material 18+ 高级教程 – Material Form Field
    介绍FormField或TextField是MaterialDesign独有的设计风格。它长这样注:MaterialDesign管它叫TextField,AngularMaterial管它叫FormField。我们不要乱,本篇统一叫FormField就好。顾名思义,Form代表表单,Field代表<fieldset>里的field。拿一个 W3Schools......
  • 【高光谱遥感分类论文解读1】Hyperspectral Image Classification Using Group-Aware
    目录一、论文基本信息二、研究背景三、研究方法1.GAHT总体框架2.GPE模块3.Transformer编码模块四、实验本文是博主对原论文的解读,仅代表博主个人观点,欢迎在评论区和我交流~其中,本博文中的图片和公式均来源于原论文,如需进一步了解,请查看原论文。一、论文基本信息......
  • 在Django中使用Celery
    首先需要确保安装依赖pipinstallceleryrediseventlet在创建的app文件内添加tasks.py#app01/tasks.pyfromceleryimportshared_task@shared_taskdefsimple_task():print('Taskexecutedsuccessfully')在项目目录下(与settings.py文件同级)添加celery.py......