【Django】执行查询——查询JSONField

JSONField

本篇的例子以下面这个模型为基础:

from django.db import models


class Dog(models.Model):
    name = models.CharField(max_length=200)
    data = models.JSONField(null=True)

    def __str__(self):
        return self.name

保存和查询None值

在使用JSONField时,要注意空值的处理,注意区分SQL NULLJSON null

保存None值

我们首先创建两个Dog实例

from django.db.models import Value, JSONField

>>> Dog.objects.create(name="Max", data=None)  # SQL NULL.
<Dog: Max>
>>> Dog.objects.create(name="Archie", data=Value(None, JSONField()))  # JSON null.
<Dog: Archie>

观察两个实例在数据库中的表现,可以发现SQL NULLJSON null是不一样的。
在这里插入图片描述

查询None值

查询时,None值将被解释为JSON null,要查询SQL NULL,需要使用isnull

>>> Dog.objects.filter(data=None)
<QuerySet [<Dog: Archie>]>
>>> Dog.objects.filter(data=Value(None, JSONField()))
<QuerySet [<Dog: Archie>]>
>>> Dog.objects.filter(data__isnull=True)
<QuerySet [<Dog: Max>]>
>>> Dog.objects.filter(data__isnull=False)
<QuerySet [
### 如何在 Django 中集成 MongoDB 使用 REST framework (DRF) 为了使 Django 项目能够利用 MongoDB 的灵活性和性能优势,可以通过安装 `Django Rest Framework Mongoengine` 来实现这一目标。该工具包提供了对 DRF 和 MongoEngine 的支持,使得开发者可以在基于 Django 的应用程序中无缝地操作 MongoDB 数据库[^1]。 #### 安装依赖 确保环境已准备好所需的 Python 版本以及 DjangoDjango Rest Framework 和 MongoEngine 的适当版本。对于特定的操作系统如 Ubuntu 18.04 及指定的软件版本(例如 Django 2.0.5, DRF 3.9, MongoEngine 0.16),可以根据实际情况调整这些设置[^2]。 ```bash pip install djangorestframework-mongoengine pip install django pip install djangorestframework pip install mongoengine ``` #### 创建模型 定义一个继承自 `mongoengine.Document` 类的新类来表示集合中的文档结构。这允许应用按照面向对象的方式处理 NoSQL 数据存储。 ```python import mongoengine as me class User(me.Document): username = me.StringField(required=True) email = me.EmailField() password = me.StringField(required=True) meta = {'collection': 'users'} ``` #### 设置配置文件 编辑项目的 `settings.py` 文件以包含必要的中间件和应用程序列表条目,并指明默认连接至哪个数据库实例。 ```python INSTALLED_APPS = [ ... 'rest_framework', ] DATABASES = { "default": {"ENGINE": "django.db.backends.dummy"} } from mongoengine import connect connect(db='your_database_name', host='localhost', port=27017) ``` #### 构建 API 视图 编写视图函数或类以便响应 HTTP 请求并将业务逻辑封装起来。这里展示了一个简单的例子——获取所有用户的 GET 方法: ```python from rest_framework.views import APIView from rest_framework.response import Response from .models import User from .serializers import UserSerializer class UsersList(APIView): def get(self, request): users = User.objects.all()[:10] serializer = UserSerializer(users, many=True, context={'request': request}) return Response(serializer.data) ``` #### 序列化器设计 创建序列化器用来转换复杂的查询结果为 JSON 或 XML 形式的输出;同时也负责验证传入的数据格式是否正确无误。 ```python from rest_framework_mongoengine.serializers import DocumentSerializer class UserSerializer(DocumentSerializer): class Meta: model = User fields = '__all__' def create(self, validated_data): user = super().create(validated_data) # 执行额外的动作比如发送欢迎邮件给新用户 return user def update(self, instance, validated_data): updated_user = super().update(instance, validated_data) # 更新后的动作... return updated_user ``` 以上步骤展示了如何在一个典型的 Django Web 开发环境中引入 MongoDB 并通过 RESTful 接口对其进行访问[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个甜甜的大橙子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值