Qt之QDjango-db的简单使用

news2025/2/25 2:42:14

QDjango是一款由C++编写、依托于Qt库的Web开发框架,其设计理念受到了广受欢迎的Python框架Django的影响。这个项目旨在提供一个高效、灵活且易于使用的工具集,帮助开发者构建高质量的Web应用。其项目地址: https://gitcode.com/gh_mirrors/qd/qdjango,项目结构中存在db和http两部分,db为Qt的ORM实现,该模块包装一下可以作为简单的ORM库使用。
QDjango
如果项目中不想SQL语句写的到处都是,一个简单ORM库还是有必要的,同时也能避免依赖某一种数据库。以下工程为简单包装QDjango-db的简单实现。当然个人不建议使用该模块,主要QDjango已经很久不维护了,可以使用ODB来做相同的工作。
在这里插入图片描述

// 以下为QDjango-db的简单包装
    // 创建
    template<typename T>
    bool createHandle() {
        QDjango::registerModel<T>();
        return QDjango::createTables();
    }
    // 增加
    void addHandle(std::function<void()> f) { f();}
    // 删除
    void delHandle(std::function<void()> f) { f();}
    // 更改
    template<typename T>
    bool modifyHandle(const QVariantMap &fields) {
        return QDjangoQuerySet<T>().update(fields);
    }
    // 查询:不能嵌套查询,只能简单查询,复杂的可以研究QDjangoQuerySet类
    template<typename T>
    T* selectHandle(const QStringList& slParam, QDjangoWhere::Operation op) {
        Q_ASSERT(slParam.size() == 2);
        return QDjangoQuerySet<T>().get(QDjangoWhere(slParam[0], op, slParam[1]));
    }
    // 清表
    template<typename T>
    bool clearHandle() {
        return QDjangoQuerySet<T>().remove();
    }
    // 删表
    bool dropHandle() {
        return QDjango::dropTables();
    }
class User : public QDjangoModel
{
    Q_OBJECT
    Q_PROPERTY(QString username READ username WRITE setUsername)
    Q_PROPERTY(QString first_name READ firstName WRITE setFirstName)
    Q_PROPERTY(QString last_name READ lastName WRITE setLastName)
    Q_PROPERTY(QString email READ email WRITE setEmail)
    Q_PROPERTY(QString password READ password WRITE setPassword)
    Q_PROPERTY(bool is_active READ isActive WRITE setIsActive)
    Q_PROPERTY(bool is_staff READ isStaff WRITE setIsStaff)
    Q_PROPERTY(bool is_superuser READ isSuperUser WRITE setIsSuperUser)
    Q_PROPERTY(QDateTime date_joined READ dateJoined WRITE setDateJoined)
    Q_PROPERTY(QDateTime last_login READ lastLogin WRITE setLastLogin)

    Q_CLASSINFO("username", "max_length=30")
    Q_CLASSINFO("first_name", "max_length=30")
    Q_CLASSINFO("last_name", "max_length=30")
    Q_CLASSINFO("password", "max_length=128")
public:
    User(QObject *parent = 0);

    QString username() const;
    void setUsername(const QString &username);

    QString firstName() const;
    void setFirstName(const QString &firstName);

    QString lastName() const;
    void setLastName(const QString &lastName);

    QString email() const;
    void setEmail(const QString &email);

    QString password() const;
    void setPassword(const QString &password);

    // flags
    bool isActive() const;
    void setIsActive(bool isActive);

    bool isStaff() const;
    void setIsStaff(bool isStaff);

    bool isSuperUser() const;
    void setIsSuperUser(bool isSuperUser);
    
    // dates
    QDateTime dateJoined() const;
    void setDateJoined(const QDateTime &dateJoined);
    
    QDateTime lastLogin() const;
    void setLastLogin(const QDateTime &lastLogin);
private:
    QString m_username;
    QString m_firstName;
    QString m_lastName;
    QString m_email;
    QString m_password;
    bool m_isActive;
    bool m_isStaff;
    bool m_isSuperUser;
    QDateTime m_dateJoined;
    QDateTime m_lastLogin;
};
    if (qDjangoHandle::getSingleInstance().initialiseDatabase())
    {
        if (qDjangoHandle::getSingleInstance().createHandle<User>()) {
            // add
            qDjangoHandle::getSingleInstance().addHandle([&](){
                User user;
                user.setUsername("root");
                user.setFirstName("Li");
                user.setLastName("si");
                user.setPassword("1234");
                if (!user.save()) {
                    qDebug() << "save failed";
                }
            });
            // modify
            QVariantMap vmap;
            vmap["username"] = "root1";
            qDjangoHandle::getSingleInstance().modifyHandle<User>(vmap);
            // query
            QStringList slCondition;
            slCondition << "username" << "root1";
            User* p = qDjangoHandle::getSingleInstance().selectHandle<User>(slCondition, QDjangoWhere::Equals);
            if (p != nullptr)
                qDebug() << p->firstName() << p->lastName();
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2280648.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

音频入门(二):音频数据增强

本文介绍了一些常见的音频数据增强方法&#xff0c;并给出了代码实现。 目录 一、简介 二、代码 1. 安装必要的库 2. 代码 3. 各函数的介绍 4. 使用方法 参考&#xff1a; 一、简介 音频数据增强是机器学习和深度学习领域中用于改善模型性能和泛化能力的技术。 使用数据…

【C++】引用(上)

1、引用的基本使用 作用&#xff1a;给变量起别名 语法&#xff1a;数据类型&#xff08;该数据类型要与原名的数据类型一致&#xff09; &别名原名&#xff1b; 示例&#xff1a; #include<iostream> using namespace std; int main() {int a 10;int& …

DBeaver下载安装及数据库连接(MySQL)

1. DBeaver下载 官网下载地址:Download | DBeaver Community 2. 安装 1. 双击下载的安装包&#xff0c;选择简体中文。 2. 点击下一步。 3. 点击我接受。 4. 如下勾选为所有用户安装&#xff0c;点击下一步。 5. 需重复做1~3 的步骤。 6. 选择组件&#xff0c;默认即可&…

leetcode 1620. 网络信号最好的坐标

题目如下 数据范围 示例 观察数据范围我们可以看到信号塔最多只有50座而x 与 y范围则是在0到50之间。 如果我们暴力枚举的话计算次数最多51 * 51 * 50时间复杂度即为O&#xff08;n * n * M&#xff09; 显然题目暗示我们使用枚举法通过代码 class Solution { public:vect…

《罗宾逊-旅途VR》Build2108907官方学习版

《罗宾逊-旅途VR》官方版 https://pan.xunlei.com/s/VODiY5gn_fNxKREdVRdwVboCA1?pwdsh3f# 从第一人称的角度进行探索&#xff0c;玩家将遇到一系列恐龙和生物&#xff0c;这些恐龙和生物会对它们在泰森三世生态系统中的存在做出反应。强调与周围环境的互动&#xff0c;鼓励玩…

Leetcode:2239

1&#xff0c;题目 2&#xff0c;思路 循环遍历满足条件就记录&#xff0c;最后返回结果值 3&#xff0c;代码 public class Leetcode2239 {public static void main(String[] args) {System.out.println(new Solution2239().findClosestNumber(new int[]{-4, -2, 1, 4, 8})…

LeetCode:37. 解数独

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;37. 解数独 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff…

FPGA与ASIC:深度解析与职业选择

IC&#xff08;集成电路&#xff09;行业涵盖广泛&#xff0c;涉及数字、模拟等不同研究方向&#xff0c;以及设计、制造、封测等不同产业环节。其中&#xff0c;FPGA&#xff08;现场可编程门阵列&#xff09;和ASIC&#xff08;专用集成电路&#xff09;是两种重要的芯片类型…

Linux内存管理(Linux内存架构,malloc,slab的实现)

文章目录 前言一、Linux进程空间内存分配二、malloc的实现机理三、物理内存与虚拟内存1.物理内存2.虚拟内存 四、磁盘和物理内存区别五、页页的基本概念&#xff1a;分页管理的核心概念&#xff1a;Linux 中分页的实现&#xff1a;总结&#xff1a; 六、伙伴算法伙伴算法的核心…

GIFT ICA 下载记录

1.帮助文档 Group ICA/IVA Of fMRI Toolbox&#xff1b;【GIFT介绍】 Group ICA of fMRI Toolbox (GIFT) Walk Through&#xff1b;【流程介绍】 GIFT v1.3c Functions Srinivas Rachakonda, Eric Egolf and Vince Calhoun【流程解释】 2.下载记录 从官网下载程序包&#xff0…

PHP礼品兑换系统小程序

&#x1f381; 礼品兑换系统&#xff1a;革新企业礼品管理&#xff0c;专属神器来袭&#xff01; &#x1f4bb; 一款专为追求高效与个性化的现代企业量身打造的礼品兑换系统&#xff0c;它基于强大的ThinkPHP框架与前沿的Uniapp技术栈深度融合&#xff0c;不仅完美适配礼品卡…

kafka学习笔记6 ACL权限 —— 筑梦之路

在Kafka中&#xff0c;ACL&#xff08;Access Control List&#xff09;是用来控制谁可以访问Kafka资源&#xff08;如主题、消费者组等&#xff09;的权限机制。ACL配置基于Kafka的kafka-acls.sh工具&#xff0c;能够管理对资源的读取、写入等操作权限。 ACL介绍 Kafka的ACL是…

webrtc入门系列(五)amazon-kinesis-video-streams-webrtc-sdk-c编译

《webrtc入门系列&#xff08;一&#xff09;easy_webrtc_server 入门环境搭建》 《webrtc入门系列&#xff08;二&#xff09;easy_webrtc_server 入门example测试》 《webrtc入门系列&#xff08;三&#xff09;云服务器coturn环境搭建》 《webrtc入门系列&#xff08;四&…

利用免费GIS工具箱实现高斯泼溅切片,将 PLY 格式转换为 3dtiles

在地理信息系统&#xff08;GIS&#xff09;和三维数据处理领域&#xff0c;不同数据格式有其独特应用场景与优势。PLY&#xff08;Polygon File Format&#xff09;格式常用于存储多边形网格数据&#xff0c;而 3DTiles 格式在 Web 端三维场景展示等方面表现出色。将 PLY 格式…

两天时间!我搞定了Intel显卡(核显)+Windows安装stable-diffusion-AI画画软件

两天时间&#xff01;我搞定了Intel显卡&#xff08;核显&#xff09;Windows安装stable-diffusion-AI画画软件 文章目录 两天时间&#xff01;我搞定了Intel显卡&#xff08;核显&#xff09;Windows安装stable-diffusion-AI画画软件前言一、工具的选择二、工具的熟悉三、硬件…

云计算、AI与国产化浪潮下DBA职业之路风云变幻,如何谋破局启新途?

引言 在近日举办的一场「云和恩墨大讲堂」直播栏目中&#xff0c;云和恩墨联合创始人李轶楠、副总经理熊军和欧冶云商数据库首席薛晓刚共同探讨了DBA的现状与未来发展。三位专家从云计算、人工智能、国产化替代等多个角度进行了深入的分析和探讨&#xff0c;为从业者提供了宝贵…

npm install 报错:Command failed: git checkout 2.2.0-c

[TOC](npm install 报错&#xff1a;Command failed: git checkout 2.2.0-c) npm install 报错&#xff1a;Command failed: git checkout 2.2.0-c export NODE_HOME/usr/local/node-v14.14.0-linux-x64 npm config set registry https://registry.npmmirror.com 使用如上环…

场馆预定平台高并发时间段预定实现V2

&#x1f3af; 本文档介绍了场馆预订系统接口V2的设计与实现&#xff0c;旨在解决V1版本中库存数据不一致及性能瓶颈的问题。通过引入令牌机制确保缓存和数据库库存的最终一致性&#xff0c;避免因服务器故障导致的库存错误占用问题。同时&#xff0c;采用消息队列异步处理库存…

图解Git——分布式Git《Pro Git》

分布式工作流程 Centralized Workflow&#xff08;集中式工作流&#xff09; 所有开发者都与同一个中央仓库同步代码&#xff0c;每个人通过拉取、提交来合作。如果两个开发者同时修改了相同的文件&#xff0c;后一个开发者必须在推送之前合并其他人的更改。 Integration-Mana…

将 AzureBlob 的日志通过 Azure Event Hubs 发给 Elasticsearch(1.标准版)

问题 项目里使用了 AzureBlob 存储了用户上传的各种资源文件&#xff0c;近期 AzureBlob 的流量费用增长很快&#xff0c;想通过分析Blob的日志&#xff0c;获取一些可用的信息&#xff0c;所以有了这个需求&#xff1a;将存储账户的日志&#xff08;读写&#xff0c;审计&…