Django:使用没有定义关系的预制mysql数据库

时间:2018-05-11 05:55:36

标签: mysql django foreign-keys django-migrations

我有一个包含数据的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'

2 个答案:

答案 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'