1

次の(関連する)モデルを取得しました。供給は多対多フィールドです。

class Supplies(models.Model):
    id = models.IntegerField(primary_key=True, editable=False)
    name_html = models.CharField(max_length=100L)
    name_verbose = models.CharField(max_length=150L)
    class Meta:
        db_table = u'supplies'
    def __unicode__(self):
        return self.name_html

class Manufacturer(models.Model):
    id = models.IntegerField(primary_key=True, editable=False)
    name = models.CharField(max_length=135)
    country = models.ForeignKey(Country)
    supplies = models.ManyToManyField(Supplies, blank=True)
    class Meta:
        db_table = u'manufacturer'
    def __unicode__(self):
        return self.name
        return self.country

中間テーブル:

CREATE TABLE IF NOT EXISTS `manufacturer_supplies` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `manufacturer_id` int(11) NOT NULL,
  `supplies_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `manufacturer_id` (`manufacturer_id`),
  KEY `supplies_id` (`supplies_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=174 ;
ALTER TABLE `manufacturer_supplies`
  ADD CONSTRAINT `manufacturer_supplies_ibfk_3` FOREIGN KEY (`supplies_id`) REFERENCES `supplies` (`id`),
  ADD CONSTRAINT `manufacturer_supplies_ibfk_2` FOREIGN KEY (`manufacturer_id`) REFERENCES `manufacturer` (`id`);

Django Admin では、すべてが完全に表示されfilter_horizontalます。しかし、新しい「メーカー」を保存しようとすると、次のようになります。ValueError: "<Manufacturer: thisIsTheManufacturerName>" needs to have a value for field "manufacturer" before this many-to-many relationship can be used.

「メーカー」によるとmanufacturer_id、中間テーブルのフィールドがエラーの原因であると思います。私はかなり迷っています...

履歴 データベースのレイアウトを設計したとき、Django が m2m 関係自体を処理できることを知りませんでした。だから私はで定義されたm2mモデルから始めthroughます。同じエラーが発生しました。だから私は自分のモデル、DBテーブルを削除して実行しましmanage.py syncdbた。次に、Django は中間テーブル自体を作成しました。もう一度切り替えたので、エラーを除外するために、中間のテーブル レイアウトを投稿しました。

4

1 に答える 1

0

問題自体は解決されていませんが、失敗する理由は明らかです。

admin.py では、フィールドに a を表示しますlist_display(関連性がないと思ったため、残念ながらここでは言及しませんでした)。しかし、ドキュメントには次のように書かれています。

テーブルの行ごとに個別の SQL ステートメントを実行する必要があるため、ManyToManyField フィールドはサポートされていません。それにもかかわらず、これを行いたい場合は、モデルにカスタム メソッドを指定し、そのメソッドの名前を list_display に追加します。(list_display のカスタム メソッドの詳細については、以下を参照してください。)

于 2013-10-20T13:49:43.267 に答える