Django:ForeignKey和related_name

时间:2018-08-23 10:20:01

标签: django django-models foreign-keys

请帮助我用ForeignKeys编写模型。

表1:

| ports | CREATE TABLE `ports` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`device_id` int(11) DEFAULT NULL,
`name` int(10) DEFAULT NULL,
`login` varchar(255) DEFAULT NULL,
`state` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `device_id` (`device_id`),
KEY `name` (`name`),
KEY `state` (`state`),
KEY `login` (`login`),
CONSTRAINT `ports_ibfk_1` FOREIGN KEY (`device_id`) REFERENCES 
`switch` (`id`) ON DELETE CASCADE
)

表1的模型

class Ports(models.Model):
    device_id = models.ForeignKey('Switch', models.DO_NOTHING, blank=True, null=True)
    name = models.IntegerField(blank=True, null=True)
    login = models.CharField(max_length=255, blank=True, null=True)
    state = models.IntegerField(blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'ports'

表2:

| switch | CREATE TABLE `switch` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL DEFAULT '',
`addr` varchar(255) NOT NULL DEFAULT '',
`community` varchar(255) NOT NULL DEFAULT '',
`type` int(11) DEFAULT NULL,
`ports` int(11) DEFAULT NULL,
`street_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `type` (`type`),
CONSTRAINT `switch_ibfk_1` FOREIGN KEY (`type`) REFERENCES `switch_types` (`id`)
) 

表2的模型

class Switch(models.Model):
    name = models.CharField(max_length=255)
    addr = models.CharField(max_length=255)
    community = models.CharField(max_length=255)
    type = models.ForeignKey('SwitchTypes', models.DO_NOTHING, db_column='type', blank=True, null=True)
    ports = models.IntegerField(blank=True, null=True)
    street_id = models.IntegerField(blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'switch'

运行服务器时出现错误:

  

错误:

     

api.Ports.device_id :(字段E303)“ Ports.device_id”的反向查询名称与字段名称“ Switch.ports”冲突。       提示:重命名字段“ Switch.ports”,或在字段“ Ports.device_id”的定义中添加/更改related_name参数。

我无法在MySQL的Switch表中重命名ports列。只读。 我应该设置device_id字段的哪个related_name?如果我添加related_name ='+',所有的操作都不会出错,但是'+'会禁用映射。 还是我需要做其他事情?

0 个答案:

没有答案