Две модели, указывающие на одну таблицу базы данных в Django 2.1

Я работаю над проектом Django, созданным бывшим сотрудником компании (поэтому я рефакторинг всего проекта, созданного кем-то другим, который не следовал рекомендациям Django Best Practices), в котором есть две модели в разных приложениях, использующих одни и те же таблицы. по базе данных. Таблицы City и State используются в обоих приложениях.

Я хочу знать, как лучше всего применять концепции DRY и использовать только одну модель для доступа двух приложений к этим таблицам.

Два приложения находятся в папке проекта, и у каждого из них есть собственный models.py со следующим кодом для города/штата:

from django.db import models
from django.contrib.auth.models import User,Group
from django.db.models.signals import post_save
from django.dispatch import receiver

class state(models.Model):
    class Meta:
        db_table = '"db_property"."state"'
    created_at = models.DateTimeField(db_column='created_at')
    updated_at = models.DateTimeField(db_column='updated_at')
    name = models.CharField(db_column='name',max_length=50)

class city(models.Model):
    class Meta:
        db_table = '"db_property"."city"'
    created_at = models.DateTimeField(db_column='created_at')
    updated_at = models.DateTimeField(db_column='updated_at')
    name = models.CharField(db_column='name',max_length=50)
    state = models.ForeignKey(state,on_delete=models.CASCADE)

person C. S. F. Junior    schedule 18.07.2019    source источник
comment
Я не понимаю, почему вам нужно определять эти модели дважды. Зачем ты это делаешь?   -  person Daniel Roseman    schedule 18.07.2019
comment
Я этого не сделал. Мой вопрос заключается именно в том, что мне нужно сделать, чтобы стереть одну из моделей, и приложение продолжало работать нормально. Я рефакторинг чужого кода.   -  person C. S. F. Junior    schedule 18.07.2019


Ответы (1)


Я что-то пропустил?

Поместите city и state в то или иное приложение или даже в свое собственное citystate приложение и импортируйте их из того места, где они определены. В приложении под названием foo:

from citystate.models import city, state

Между прочим, модели Django имеют номер classes, поэтому их обычно начинают с заглавной буквы: City и State. Соблюдение таких соглашений: вы можете не запутаться (пока), но вы чертовски запутаете любого, кто читает этот код, кто подумает, что эти импортируемые вещи являются функциями, а не классами!

Приложение не обязательно должно иметь какие-либо представления, URL-адреса и т. д. Это может быть просто место для размещения общих моделей и их миграций, а также, возможно, некоторые классы администратора.

person nigel222    schedule 18.07.2019
comment
Спасибо за ваш ответ, просто чтобы уточнить: учитывая, что у меня есть эта модель города в одном приложении, все, что мне нужно сделать, это импортировать ее в скольких представлениях я хочу использовать ее в любом приложении внутри проекта? Чтобы я мог удалить повторяющуюся модель из другого приложения? Делая это, я должен запустить makemigrations/migrate для обновления базы данных, или это не повлияет на БД? Насчет заглавной буквы согласен. Я занимаюсь рефакторингом всего проекта, сделанного бывшим сотрудником. Спасибо еще раз. - person C. S. F. Junior; 18.07.2019
comment
Да, определенно просто определите в одном месте и импортируйте куда угодно. Я ничего не знаю о переходе от прежнего плохого дизайна, кроме того, что будьте очень осторожны, чтобы ничего не сломать! Удаление модели по умолчанию приведет к удалению ее таблицы БД при переносе ... обычно это правильно, но здесь не требуется. - person nigel222; 18.07.2019
comment
Я склоняюсь к одному приложению на таблицу, если только нет очень тесно взаимосвязанных моделей, которые нет абсолютно никакого смысла разделять. YMMV. У меня также есть приложение utils, в котором я паркую все, что не привязано к БД и не относится к одному приложению, например, теги шаблонов, служебные функции, шаблоны общего назначения .... - person nigel222; 18.07.2019