2

そこで、次の表を作成して、1 つのことをテストしました。

# Dump of table driverclass
# ------------------------------------------------------------

CREATE TABLE `driverclass` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

# Dump of table event
# ------------------------------------------------------------

CREATE TABLE `event` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

# Dump of table driver
# ------------------------------------------------------------

CREATE TABLE `driver` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

# Dump of table driver_driverclass_event
# ------------------------------------------------------------

CREATE TABLE `driver_driverclass_event` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `driver_id` int(11) unsigned DEFAULT NULL,
  `event_class_id` int(11) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `driver_id` (`driver_id`),
  KEY `event_class_id` (`event_class_id`),
  CONSTRAINT `driver_driverclass_event_ibfk_2` FOREIGN KEY (`event_class_id`) REFERENCES `driverclass_event` (`id`),
  CONSTRAINT `driver_driverclass_event_ibfk_1` FOREIGN KEY (`driver_id`) REFERENCES `driver` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

# Dump of table driverclass_event
# ------------------------------------------------------------

CREATE TABLE `driverclass_event` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `event_id` int(11) unsigned DEFAULT NULL,
  `driverclass_id` int(11) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `event_id` (`event_id`),
  KEY `driverclass_id` (`driverclass_id`),
  CONSTRAINT `driverclass_event_ibfk_2` FOREIGN KEY (`driverclass_id`) REFERENCES `driverclass` (`id`),
  CONSTRAINT `driverclass_event_ibfk_1` FOREIGN KEY (`event_id`) REFERENCES `event` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

に関する関係であるべきですManyToManyField。ただし、Djangos inspectdbForeignKeys のトンを持つ 5 つのモデルとしてそれを見てください。Djangos inspectdbManyToManyFields を考慮していませんか、それともデータベース モデルが間違っていますか?

4

1 に答える 1

5

データベース スキーマは問題ないようです。ただし、ご存知のように、Django は多対多フィールドを自動的に作成しません。driverclass_eventと ** driver_driverclass_event**のモデルは、いわゆる「スルー」モデルです。通常、リレーションシップの両端でManyToManyFieldも定義し、正しい「スルー」モデルを指定します。

class Event(db.Model):
    pass

class DriverClass(db.Model):
    events = db.ManyToManyField(Event, through='DriverClassEvent')

class DriverClassEvent(db.Model):
    driver_class = db.ForeignKeyField(DriverClass)
    event = db.ForeignKeyField(Event)

参照: https://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships

通常、スルー モデルは、リレーションシップの開始日などのリレーションシップに関する情報を保存する場合や、外部キーを使用してこのリレーションシップを参照する場合に使用されますあなたの例では、どのドライバーがDriverClassEventと関係があるかを保存します。したがって、 DriverClassEventには、参照できるモデルが必要です。

class DriverDriverClassEvent(db.Model):
    driver = db.ForeignKeyField(Driver)
    driver_class_event = db.ForeignKeyField(DriverClassEvent)

class Driver(db.Model):
    driver_class_events = db.ManyToManyField(DriverClassEvent, through='DriverDriverClassEvent')

そのリレーションシップに関するデータを保存しないか、他のモデルでリレーションシップを参照しないため、 DriverDriverClassEventを削除できます。したがって、最後の例は次のようになります*:

class Driver(db.Model):
    driver_class_events = db.ManyToManyField(DriverClassEvent, db_table='driver_driverclass_event')

* フィールド名を制御できないことに注意してください。したがって、それらは Django の自動生成されたフィールド名と一致する必要があります。

于 2013-08-06T07:23:14.123 に答える