2013-04-16 7 views
0

Je suis nouveau à Django et j'ai quelques problèmes avec une relation ManyToMany. Je travaille sur une automatisation BLASTN et voici mes classes:Django ManyToManyField non présent dans Sqlite3

class Annotation(models.Model): 
    sequence = models.IntegerField() 
    annotation = models.TextField() 
    start = models.IntegerField() 
    end = models.IntegerField() 

class Blast(models.Model): 
    sequence = models.ManyToManyField(Annotation, through="AnnotBlast") 
    expectValue = models.IntegerField() 

class AnnotBlast(models.Model): 
    id_blast = models.ForeignKey(Blast, to_field="id") 
    id_annot = models.ForeignKey(Annotation, to_field="id") 

class Hit(models.Model): 
    id_hit = models.ForeignKey(Blast, to_field="id") 
    length = models.IntegerField() 
    evalue = models.IntegerField() 
    start_seq = models.IntegerField() 
    end_seq = models.IntegerField() 

Dans une vue, je veux accéder aux données de Annotation du reste du modèle via ce nombre à plusieurs champs, puis appliquer des filtres basés sur une forme. Mais quand je fais un syncdb, le champ de la classe Blast disparaître « séquence »:

En Sqlite3:

.schema myApp_blast 
CREATE TABLE "myApp_blast" (
    "id" integer not null primary key, 
    "expectValue" integer not null 
); 

donc je ne peux pas charger des données dans ce tableau que je veux. Je ne comprends pas pourquoi ce champ disparaît lors de la syncdb. Comment puis-je faire pour lier la première classe aux autres (et ensuite pouvoir fusionner les données dans un modèle)?

Répondre

0

Un ManyToManyField n'est pas lui-même une colonne dans la base de données. Il est représenté uniquement par un élément dans la table de jointure, que vous avez explicitement défini ici comme AnnotBlast (notez que puisque vous ne définissez aucun champ supplémentaire sur la relation, vous n'avez pas besoin de définir une table traversante - Django aurait faites-le automatiquement si vous ne l'avez pas fait). Par conséquent, pour ajouter des données à vos modèles, vous ajoutez des données à la table AnnotBlast pointant vers les lignes Blast et Annotation appropriées.

+0

Merci, votre remarque m'a aidé. Je pensais vraiment que le ManyToManyField était une colonne dans la base de données ... Merci Daniel! –