Django: использование готовой базы данных mysql без определенных отношений - PullRequest
0 голосов
/ 11 мая 2018

У меня есть база данных 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 голосов
/ 11 мая 2018

Из документации django на related_name :

Имя, которое нужно использовать для отношения от связанного объекта к этому. Это также значение по умолчанию для 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'
0 голосов
/ 11 мая 2018

Пожалуйста, перейдите по следующей ссылке: Django - Устаревшие базы данных

После того, как вы создали models.py, вам нужно будет выполнить migrate.После первого migrate перейдите в models.py и внесите необходимые изменения!

РЕДАКТИРОВАНИЕ / ДОБАВЛЕНИЕ

По существу:

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 позаботится об установлении отношений MySQL в БД, что является всей целью использования ORM django.

После того как вы определили поля в django, запустите миграцию:

python manage.py makemigrations
python manage.py migrate

Django должен соответствующим образом изменить таблицы в вашем MySQL (я не уверен на 100%)

...