1

残念ながら、私はすべての時間を取っている小さな小さな問題を抱えています。

それは本当に簡単です。すでにデータベースがあり、models.py と admin.py を作成して変更しました。私のデータベースに値を入力する必要がある一部のスタッフ ユーザーは、そのための最も単純なフォームを必要としています。

これが私のデータベースです:


-- 表NGSdb.line


CREATE  TABLE IF NOT EXISTS `NGSdb`.`line` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `value` INT NOT NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;


CREATE UNIQUE INDEX `value_UNIQUE` ON `NGSdb`.`line` (`value` ASC) ;

-- 表NGSdb.run_has_sample_lines


CREATE  TABLE IF NOT EXISTS `NGSdb`.`run_has_sample_lines` (
  `line_id` INT NOT NULL ,
  `runhassample_id` INT NOT NULL ,
  PRIMARY KEY (`line_id`, `runhassample_id`) ,
  CONSTRAINT `fk_sample_has_line_line1`
    FOREIGN KEY (`line_id` )
    REFERENCES `NGSdb`.`line` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_sample_has_line_run_has_sample1`
    FOREIGN KEY (`runhassample_id` )
    REFERENCES `NGSdb`.`run_has_sample` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)

-- 表NGSdb.run_has_sample


CREATE  TABLE IF NOT EXISTS `NGSdb`.`run_has_sample` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `run_id` INT NOT NULL ,
  `sample_id` INT NOT NULL ,
  `dna_quantification_ng_per_ul` FLOAT NULL ,
  PRIMARY KEY (`id`, `run_id`, `sample_id`) ,
  CONSTRAINT `fk_run_has_sample_run1`
    FOREIGN KEY (`run_id` )
    REFERENCES `NGSdb`.`run` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_run_has_sample_sample1`
    FOREIGN KEY (`sample_id` )
    REFERENCES `NGSdb`.`sample` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)

ここに私の models.py があります:

class Run(models.Model):
    id = models.AutoField(primary_key=True)   
    start_date = models.DateField(null=True, blank=True, verbose_name='start date')
    end_date = models.DateField(null=True, blank=True, verbose_name='end date')
    project = models.ForeignKey(Project)
    sequencing_type = models.ForeignKey(SequencingType)
    def __unicode__(self):
        return u"run started %s from the project %s" % (self.start_date,self.project)


class Line(models.Model):
    id = models.AutoField(primary_key=True)
    value = models.IntegerField()
    def __unicode__(self):
        return u"%s" % str(self.value)


class RunHasSample(models.Model):
id = models.AutoField(primary_key=True)
run = models.ForeignKey(Run)
sample = models.ForeignKey(Sample)
dna_quantification_ng_per_ul = models.FloatField(null=True, blank=True)
lines = models.ManyToManyField(Line)
def __unicode__(self):
    return u"Sample %s from run %s" % (self.sample, self.run)

そして、ここに私の admin.py があります:

class RunHasSamplesInLine(admin.TabularInline):
    model = RunHasSample
    fields = ['sample', 'dna_quantification_ng_per_ul', 'lines']    
    extra = 6

class RunAdmin(admin.ModelAdmin):
    fields = ['project', 'start_date', 'end_date', 'sequencing_type']
    inlines = [RunHasSamplesInLine]
    list_display = ('project', 'start_date', 'end_date', 'sequencing_type') 

ご覧のとおり、スタッフがデータベースを簡単に埋めることができるように、私のサンプルは実行フォームに一列に表示されます。データベースに入力しようとすると、次のエラーが発生します。

(1054、「「フィールド リスト」の不明な列「run_has_sample_lines.id」」)

もちろん、私のデータベースにはフィールド「行」はありません! これは多対多のフィールドなので、すでに中間テーブルを作成しています!

大丈夫大丈夫!そこで、中間テーブル (run_has_sample_lines) のモデルを作成し、RunHasSample モデルの ManyToManyField に「スルー」を追加しようとしました。しかし、「スルー」を手動で追加しているため、ManyToMany フィールドを使用できません。管理者ビューに行を追加する唯一の方法は、それらを行に積み重ねることです...サンプルがすでに行にあることがわかるように、既に行にあるサンプルに新しい「インライン」を配置することは不可能です...

最後に、django が manage.py sqlall で作成したものを確認しようとしました。私はそれを見る :

 CREATE TABLE `run_has_sample_lines` (
    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
    `runhassample_id` integer NOT NULL,
    `line_id` integer NOT NULL,
    UNIQUE (`runhassample_id`, `line_id`)
)
;
ALTER TABLE `run_has_sample_lines` ADD CONSTRAINT `line_id_refs_id_4f0766aa` FOREIGN KEY (`line_id`) REFERENCES `line` (`id`);

最初にデータベースに作成したのに対し、run_has_sample テーブルには外部キーがないようです。問題はここから来ていると思いますが、解決できません。解決できることを本当に願っています...

どうもありがとうございました !

4

2 に答える 2

0

問題がどこにあるかを見つけました...

ManyToManyField では問題ではなく、中間テーブルでは問題です。Django は、中間テーブルに一意の ID がないことを拒否しました。

したがって、django を作成した sql では、「id」という名前の一意の ID が自動的に作成されましたが、私のデータベースでは作成しませんでした (通常、2 つの外部キーのペアで十分であるため)。

次回はもっと気をつけます。

于 2012-10-22T15:23:20.803 に答える
0

多対多の関係で「スルー」属性を試して、Django で中間テーブルを宣言することをお勧めします。

于 2012-10-19T21:00:41.733 に答える