问题为应用程序设置django数据库迁移,其模型与同一项目中的另一个应用程序有关系

时间:2015-08-15 16:14:52

标签: python django postgresql django-models

我试图在django项目中设置两个相关的应用程序,其中一个应用程序的模型在外键关系中引用另一个。这通常是一件简单的事情,但我遇到了与应用名称发生碰撞的问题(我的一个应用程序称为'帐户'并且在我的安装中并不是唯一的)以及随后的通过在自定义AppConfig中添加特定名称/标签定义来解决这个问题也可能导致问题。

关于我的环境的一些背景知识:

我使用此模板设置了一个简单的项目来演示问题:https://github.com/rishikumar/django_test_model

以下是树的相关部分:

test/ (project app)
/config ()
/test (main django app)
    /account
        __init__.py
        apps.py
        models.py (Has a model called "Account")
    /schedule
        __init__.py
        apps.py 
        models.py (Has a model called "Schedule" which has a ForeignKey relationship to the Account table)

这是测试/帐户应用

下的第一个模型类
class Account(models.Model):
    class Meta:
        db_table = 'test_account'

将此项目放到位后,我将此项目添加到INSTALLED_APPS作为" test.account"。我接下来运行了makemigrations。

./manage.py makemigrations test.account

我希望这能够唯一地识别测试项目下的帐户包,但它只查找"帐户"部分名称。 (我无法找到解释为什么会出现这种情况的文件)

django.core.exceptions.ImproperlyConfigured: Application labels aren't unique, duplicates: account

要解决此问题,我为此设置了自定义AppConfig。在test / test / account / init .py中我添加了以下内容:

default_app_config = 'test.account.apps.AppConfig'

为了测试/ test / account / apps.py我添加了:

class AppConfig(apps.AppConfig):
    name = 'test.account'
    label = 'test.account'

现在,我可以像我原先预期的那样运行make migration,它可以按预期工作。

./manage.py makemigrations test.account 

顺便说一下,我给模型一个特定的表名,因为它指的是" test.account_account"默认情况下,这会导致postgres CLI中出现一些令人头疼的问题 - 我必须引用整个表名来引用它。

我以相同的方式设置第二个应用程序 - 添加了一个默认的应用程序配置,并将应用程序配置的名称和标签设置为" test.schedule"

以下是计划应用中的models.py:

from test.account.models import Account


class Schedule(models.Model):
    class Meta:
        db_table = 'test_schedule'

    account = models.ForeignKey(Account)

现在我在这个应用程序上运行makemigrations:

./manage.py makemigrations test.schedule

我收到以下错误:

ValueError: Lookup failed for model referenced by field test.schedule.Schedule.account: test.schedule.test.account.Account

请注意,它尝试访问的Account类显示" test.schedule.test.account.Account"什么时候应该引用" test.account.Account"

我不确定我的AppConfig条目解决方案是否是正确的选择 - 也许有更好的方法可以在django安装中唯一标识应用程序?

我猜测我在如何在AppConfig中命名事情做出了错误的决定,但我不确定如何协调我需要指定AppConfig来避免的事实具有重复的应用程序标签,同时仍然能够避免混淆迁移工具正在使用的外键引用的查找。

0 个答案:

没有答案