2012-09-22 11 views
1

rapide googler n'a donné aucun résultat sur la façon de bien utiliser les touches étrangères QDjango - il y a des fonctionsqdjango clés étrangères

QDjangoModel::foreignKey et QDjangoModel::setForeignKey - mais je ne pouvais pas trouver de bons exemples sur la façon de les utiliser dans la pratique.

Répondre

2

Son assez vieux, va peut-être aider quelqu'un d'autre .. j'ai cherché dans QDjango pour FKs éons et a trouvé quelque chose dans google group, il y a aussi nice documentation avec quelques exemples de base (mais pas d'exemples FK)

I create table modèles utilisant QDjango de cette façon (aussi les clés étrangères):

class Role : public QDjangoModel { ... }; 

class User : public QDjangoModel 
{ 
    Q_OBJECT 
    Q_PROPERTY(QString name READ name WRITE setName) 
    Q_PROPERTY(QString password READ password WRITE setPassword) 
    Q_PROPERTY(Role *role READ role WRITE setRole) 

    Q_CLASSINFO("name", "max_length=255") 
    Q_CLASSINFO("password", "max_length=255") 
    Q_CLASSINFO("role", "on_delete=cascade") 


    QString mName; 
    QString mPassword; 
public: 
    User(QObject *parent = 0); 
    QString name() const { return mName; } 
    void setName(QString name) { mName = name; } 

    QString password() const { return mPassword; } 
    void setPassword(QString pass) { mPassword = pass; } 

    Role *role() const; 
    void setRole(Role *role); 
}; 

Vous pouvez utiliser Q_CLASSINFO pour définir des attributs aux colonnes. Les clés étrangères sont liées dans le constructeur et remplies dans les fonctions de rôle.

User::User(QObject *parent) 
    : QDjangoModel(parent) 
{ 
    setForeignKey("role", new Role(this)); 
} 

Role *User::role() const 
{ 
    return qobject_cast<Role *>(foreignKey("role")); 
} 

void User::setRole(Role *role) 
{ 
    setForeignKey("role", role); 
} 

Lorsque vous souhaitez sélectionner à l'aide des champs de la table en fonction fk utilisation deux undescores et bien sûr utiliser selectRelated() (qui fixe juste un certain drapeau qui est utilisé plus tard pour produire rejoindre select) comme:

QDjangoQuerySet<User> matched; 
matched = matched.selectRelated() 
      .filter(QDjangoWhere("role__rolename", QDjangoWhere::Equals, "admin")); 
+0

Merci! Au moins, il serait dans un endroit pour la postérité :) – qdot