2011-03-21 2 views
0

J'essaie de générer un rapport sur 2 modèles/tables. Ici, ils sont:Django Foreign Key

class Members(models.Model): 
    username   = models.CharField(max_length=30,null=True, unique=True) 
    email    = models.CharField(max_length=100,null=True, unique=True) 
    name    = models.CharField(max_length=30,null=True) 
    phone    = models.CharField(max_length=30,null=True) 

et

class Report(models.Model): 
    report_text = models.CharField(max_length=500) 
    reporter_id = models.IntegerField(db_index=True) 
    reported_id = models.IntegerField(db_index=True) 
    date_created = models.DateTimeField(null=True) 
    date_read  = models.DateTimeField(null=True) 

Les 2 tables ont évidemment ID d'incrémentation automatique comme la clé primaire.

Le rapport ressemblera à ceci:

Reported Phone | Reported Name | Report | Date Reported | Date Report Read 

Tout le monde a rapporté sera dans la table membre. L'identifiant du reporter est l'identifiant du membre qui a enregistré le rapport. L'identificateur rapporté est l'ID de la personne sur laquelle se trouve le rapport. Je dois faire une jointure entre les 2 modèles pour obtenir le nom des membres et leur numéro de téléphone. Je ne peux pas tout à fait travailler sur le document. Je crois que je devrais faire le report_id et reporter_id les deux clefs étrangères au champ ID de clé primaire de table de membres. Comment puis-je faire cela et quel code va extraire le rapport pour toutes les entrées soumises par un journaliste spécifique?

Dois-je user_id = models.ForeignKey (Members) et faire la même chose pour reporter_id. Cela semble étrange car je ne spécifie pas le champ auquel le champ est étranger. L'ORM est censé le rendre plus facile (et c'est généralement le cas!). Je pourrais le faire avec une jointure en SQL mais cela m'a bloqué.

J'espère que la question a du sens.

Merci à l'avance

riches

+0

Vous devriez vraiment avoir ' ForeignKey' champs où vous voulez indiquer une relation un-à-plusieurs entre vos modèles. –

Répondre

0

Comment puis-je faire et ce code extraire le rapport pour toutes les entrées présentées par un journaliste spécifique?

Oui, ne reported_id = models.ForeignKey(Members)

Le champ seront les modèles cibles clé primaire, ce qui est dans votre cas id puisque vous en avez pas spécifié.

Vous devrez spécifier un related_name pour l'un de ces champs afin d'éviter un conflit de noms pour l'accesseur de clé étrangère inverse. Après avoir configuré le champ de clé étrangère, pour obtenir tous les objets liés via cette clé étrangère, utilisez related_name pour interroger le modèle associé.

http://docs.djangoproject.com/en/dev/topics/db/queries/#following-relationships-backward

Par exemple, si vous configurez votre modèle comme:

reporter = models.ForeignKey(Members, related_name="reports_by_me") 
reported = models.ForeignKey(Members, related_name="reports_by_others") 

Vous pouvez accéder à tous les associés Report modèles via cette clé étrangère par

member_instance.reports_by_me.all() 
member_instance.reports_by_others.all() 
+0

Sûrement le ForeignKey devrait être appelé «rapporté»? Cela utilisera 'reported_id' comme champ de base de données sous-jacent. –

+0

Ahaha, tu as absolument raison. Facepalm! –

Questions connexes