1

私は Django を初めて使用し、ManyToMany 関係に問題があります。私はblastnの自動化に取り組んでおり、ここに私のクラスがあります:

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

ビューでは、この多対多フィールドを介してモデルの残りの部分から Annotation のデータにアクセスし、フォームに基づいてフィルターを適用したいと考えています。しかし、実行するsyncdbと、Blast クラスの「シーケンス」フィールドが消えます。

Sqlite3 で:

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

そのため、このテーブルに必要なデータをロードできません。syncdb 中にこのフィールドが消える理由がわかりません。最初のクラスを他のクラスにリンクするにはどうすればよいですか (そして、テンプレートにデータをマージできるようにするには) ?

4

2 に答える 2

1

ManyToManyField 自体は、データベース内の列ではありません。これは、ここで AnnotBlast として明示的に定義した結合テーブルの要素によってのみ表されます (リレーションシップに追加のフィールドを定義していないため、実際にはスルー テーブルを定義する必要はありませんでした - Django ではしていない場合は自動的に行われます)。

したがって、モデルにデータを追加するには、関連する Blast および Annotation 行を指す AnnotBlast テーブルにデータを追加します。

于 2013-04-16T22:36:50.567 に答える
0

多対多の関係の場合、中間結合テーブルが作成されます。こちらのドキュメントを参照してください: https://docs.djangoproject.com/en/1.2/ref/models/fields/#id1

于 2013-04-16T17:41:58.270 に答える