我有一个包含数据的mysql数据库,没有定义任何关系。我想要的是在Django项目中使用这个数据库,我希望它定义关系。有些字段应该是ForeignKeys,但定义为IntegerFields。所以基本上我想将它们改为foreignKeys。
我有什么:
company_id = models.IntegerField(blank=True, null=True)
我想要的:
company_id = models.ForeignKey('Company', on_delete=models.CASCADE)
class Inquiry(models.Model):
id = models.AutoField()
company_id = models.IntegerField(blank=True, null=True)
class Meta:
managed = False
db_table = 'inquiry'
我在尝试什么:
class Inquiry(models.Model):
id = models.AutoField()
company_id=models.ForeignKey('Company',on_delete=models.CASCADE,null=True)
class Meta:
managed = True
db_table = 'inquiry'
答案 0 :(得分:0)
请参阅以下链接:Django - Legacy Databases
在您创建models.py
后,您需要执行migrate
。在第一个migrate
之后,进入models.py
并进行所需的修改!
修改/ ADDITION 强>
本质:
python manage.py inspectdb > models.py
从每个模型的managed = False
中删除class Meta:
python manage.py migrate
将其视为django从一开始就创建它:)
编辑2
同样,我的解决方案应该有效。你试图定义关系的方式不是django关系的定义方式。要将查询链接到公司,这应该有效:
class Company(models.Model):
company_name = models.CharField(max_length=50) #django automatically creates a PK/ID field
class Inquiry(models.Model):
company = models.ForeignKey(Company, on_delete=models.CASCADE, null=True, blank=True) #null and blank params not required
Django将负责在DB中建立MySQL关系,这就是使用django ORM的全部目的。
在django中定义字段后,运行迁移:
python manage.py makemigrations
python manage.py migrate
Django应该相应地更改MySQL中的表格(我不是100%肯定)
答案 1 :(得分:0)
来自related_name上的django文档:
用于从相关对象返回到此关系的关系的名称。它也是related_query_name的默认值(用于目标模型的反向过滤器名称的名称)。
在您拥有的方案中,添加公司模型,然后在查询模型ForeignKey
中,使用要链接的公司属性指定related_name
字段名称。
class Company(models.Model):
id = models.AutoField()
...
class Inquiry(models.Model):
id = models.AutoField()
company_id=models.ForeignKey(to=Company, related_name="id", null=True, blank=True)
class Meta:
managed = True
db_table = 'inquiry'