【问题标题】:Two models pointing to one database table in Django 2.1Django 2.1 中两个模型指向一个数据库表
【发布时间】:2019-11-27 12:44:14
【问题描述】:

我正在处理一个由公司前雇员制作的 Django 项目(所以我正在重构一个由不遵循 Django 最佳实践的其他人制作的整个项目),它在不同的应用程序上有两个模型,使用数据库上的相同表。两个应用程序都使用了 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)

【问题讨论】:

  • 我不明白你为什么需要定义这些模型两次。你为什么这样做?
  • 我没有。我的问题正是我必须做些什么才能删除其中一个模型并且应用程序保持正常工作。我正在重构别人的代码。

标签: python django python-3.x django-models django-2.1


【解决方案1】:

我错过了什么吗?

citystate 放在一个或其他应用程序中,甚至放在它们自己的citystate 应用程序中,然后从它们定义的位置导入它们。在名为foo 的应用中:

from citystate.models import city, state

顺便说一句,Django 模型是classes,因此通常会以大写字母开头:CityState。遵守这样的约定:你可能不会(现在)感到困惑,但你会混淆阅读这段代码的其他人,他们会认为这些被导入的东西是函数而不是类!

应用程序不需要有任何视图、url 等。它可以只是一个放置常见模型及其迁移的地方,也许还有一些管理类。

【讨论】:

  • 感谢您的回答,只是为了澄清一下:考虑到我在一个应用程序中拥有这个城市模型,我所要做的就是将它导入到我想在任何应用程序中使用它的多少视图中项目?所以我可以从其他应用程序中删除重复的模型?这样做,我必须运行 makemigrations/migrate 来更新数据库,否则它不会影响数据库?关于大写字母约定,我同意。我正在重构一位前雇员所做的整个项目。再次感谢。
  • 是的,绝对只是在一个地方定义并在其他需要的地方导入。我不知道从以前的糟糕设计中迁移出来,除了要非常小心不要破坏任何东西!默认情况下,删除模型会在迁移时删除其数据库表……这通常是正确的,但这里不需要。
  • 我倾向于每张桌子一个应用程序,除非有非常密切相关的模型,分开是绝对没有意义的。 YMMV。我还有一个utils 应用程序,我将所有与数据库无关且不特定于一个应用程序的东西都存放在其中,例如模板标签、实用程序功能、通用模板....
猜你喜欢
  • 2019-03-29
  • 2016-12-07
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
  • 2018-12-19
  • 2011-03-29
  • 2021-02-11
  • 1970-01-01
相关资源
最近更新 更多