小编典典

将models.py拆分为几个文件

django

我正在尝试将models.py我的应用拆分为几个文件:

我的第一个猜测是这样做:

myproject/
    settings.py
    manage.py
    urls.py
    __init__.py
    app1/
        views.py
        __init__.py
        models/
            __init__.py
            model1.py
            model2.py
    app2/
        views.py
        __init__.py
        models/
            __init__.py
            model3.py
            model4.py

这不起作用,然后我发现了这个问题,但是在此解决方案中,我仍然遇到问题,当我运行时,出现python manage.py sqlall app1类似以下内容:

BEGIN;
CREATE TABLE "product_product" (
    "id" serial NOT NULL PRIMARY KEY,
    "store_id" integer NOT NULL
)
;
-- The following references should be added but depend on non-existent tables:
-- ALTER TABLE "product_product" ADD CONSTRAINT "store_id_refs_id_3e117eef" FOREIGN KEY     ("store_id") REFERENCES "store_store" ("id") DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX "product_product_store_id" ON "product_product" ("store_id");
COMMIT;

我对此不太确定,但我担心有关该部分的内容 The following references should be added but depend on non-existent tables:

这是我的model1.py文件:

from django.db import models

class Store(models.Model):
    class Meta:
        app_label = "store"

这是我的model3.py文件:

from django.db import models

from store.models import Store

class Product(models.Model):
    store = models.ForeignKey(Store)
    class Meta:
        app_label = "product"

显然可以,但是我收到了评论alter table,如果我尝试执行此操作,则会发生相同的事情:

class Product(models.Model):
    store = models.ForeignKey('store.Store')
    class Meta:
        app_label = "product"

因此,我应该手动运行alter for reference吗?这可能给我带来南方问题吗?


阅读 822

收藏
2020-03-31

共3个答案

小编典典

我将执行以下操作:

myproject/
    ...
    app1/
        views.py
        __init__.py
        models.py
        submodels/
            __init__.py
            model1.py
            model2.py
    app2/
        views.py
        __init__.py
        models.py
        submodels/
            __init__.py
            model3.py
            model4.py

然后

#myproject/app1/models.py:
    from submodels/model1.py import *
    from submodels/model2.py import *

#myproject/app2/models.py:
    from submodels/model3.py import *
    from submodels/model4.py import *

但是,如果你没有充分的理由,请将model1和model2直接放在app1 / models.py中,并将model3和model4直接放在app2 / models.py中

  • -第二部分 - -

这是app1 / submodels / model1.py文件:

from django.db import models
class Store(models.Model):
    class Meta:
        app_label = "store"

因此,请更正你的model3.py文件:

from django.db import models
from app1.models import Store

class Product(models.Model):
    store = models.ForeignKey(Store)
    class Meta:
        app_label = "product"
2020-03-31
小编典典

对于Django 1.9上的任何人,框架现在都支持它,而无需定义类元数据。

https://docs.djangoproject.com/zh-CN/1.9/topics/db/models/#organizing-models-in-a-package

注意:对于Django 2,它仍然相同

manage.py startapp命令将创建一个包含models.py文件的应用程序结构。如果你有许多模型,将它们组织在单独的文件中可能会很有用。

为此,创建一个模型包。删除models.py并创建一个myapp/models/目录,其中包含一个__init__.py文件和用于存储模型的文件。你必须将模型导入__init__.py文件中。

因此,对于你来说,对于像

app1/
    views.py
    __init__.py
    models/
        __init__.py
        model1.py
        model2.py
app2/
    views.py
    __init__.py
    models/
        __init__.py
        model3.py
        model4.py

你只需要做

#myproject/app1/models/__init__.py:
from .model1 import Model1
from .model2 import Model2

#myproject/app2/models/__init__.py:
from .model3 import Model3
from .model4 import Model4

禁止导入所有类的注意事项:

显式导入每个模型而不是使用它们from .models import *的优点是不会使名称空间混乱,使代码更具可读性并保持代码分析工具有用。

2020-03-31
小编典典

我已经看到过数篇有关此问题的文章,但没有找到我的解决方案。

我正在尝试在Django 1.3开发环境中提供静态文件。

这是我的设定

...
STATIC_ROOT = '/home/glide/Documents/django/cbox/static/'
STATIC_URL = '/static/'
STATICFILES_DIRS = (
  '/static/',
)
...

我的urls.py

urlpatterns = patterns('',
...
  url(r'^static/(?P<path>.*)$', 'django.views.static.serve',
    {'document_root', settings.STATIC_ROOT}
  ),
...
);

我的/ home / glide / Documents / django / cbox / static /目录就像

css
  main.css
javascript
image

尝试访问http://127.0.0.1:8000/static/css/main.css时出现404错误。

我是否必须分别为CSS,JavaScript和图像指定模式?

2020-03-31