2013-08-06 3 views
2

그래서 다음 표를 작성하여 테스트했습니다.Django의 inspectdb는 ManyToManyField를 사용하지 않습니다.

# 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의 관계이어야합니다. 그러나, Djangosinspectdb은 ForeignKeys 톤을 가진 5 개의 모델로 보았다. Djangosinspectdb은 ManyToManyFields를 고려하지 않습니까, 아니면 내 databasemodel이 잘못 되었습니까?

+0

무엇이 출력 되었습니까? – Ngenator

+0

서로 외래 키가있는 5 개의 테이블 – Martol1ni

답변

4

데이터베이스 스키마가 정상적으로 보입니다. 그러나 Django는 자동으로 Many-To-Many 필드를 생성하지 않습니다. 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') 

* 당신이 필드 이름을 제어 할 필요는 없습니다, 그래서 사람들은 장고의 자동 생성 필드 이름에 일치해야합니다 : 그래서 마지막 예는 *가된다.

+0

게시물을 가져 주셔서 감사합니다. 당신이 모델을 이해하는지 모르겠지만, 그것이 옳다고 생각하지는 않습니다. 나는 단순히 특정 클래스와 특정 이벤트에 드라이버를 연결하려고합니다. 또한, 마지막 예제에서 DriverClassEvent에 대한 모델을 지정하지 않고 ManyToManyField (DriverClassEvent ...)를 쓸 수 있습니까? – Martol1ni

+0

내 편집을 참조하십시오. 테이블 이름으로 혼란스러워합니다. - 데이터베이스 모델은 ** driverclass ** 및 ** event **, ** driverclass_event **. ** driverclass_event **와 ** driver **, ** driver_driverclass_event ** 사이의 관계가 있습니다. 엔티티가 2 개 관계가되어 5 개의 테이블과 5 개의 모델이 생성됩니다. 두 개의 바이너리 관계는 필요 없지만 하나의 세 가지 관계가 필요합니다. 다른 데이터베이스 스키마 디자인이 필요합니다. – bouke