QDjango是一款由C++编写、依托于Qt库的Web开发框架,其设计理念受到了广受欢迎的Python框架Django的影响。这个项目旨在提供一个高效、灵活且易于使用的工具集,帮助开发者构建高质量的Web应用。其项目地址: https://gitcode.com/gh_mirrors/qd/qdjango,项目结构中存在db和http两部分,db为Qt的ORM实现,该模块包装一下可以作为简单的ORM库使用。
如果项目中不想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();
}
}