Qt之QDjango-db的简单使用

发布于:2025-02-10 ⋅ 阅读:(34) ⋅ 点赞:(0)

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();
        }
    }