V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
piaochen0
V2EX  ›  Python

关于 django model 外键到第三方插件生成表的问题

  •  
  •   piaochen0 · 2019-06-21 09:36:16 +08:00 · 1807 次点击
    这是一个创建于 2013 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我们的项目用了一些第三方的插件,会在数据库里生成一些表,例如表 A,B。我最近做的功能,自己建的表 C,表 C 里两个字段,会外键到表 A,B 的 ID。

    我自己建的表 C,可以用 ORM 来在代码中建 model,然后同步到数据库里。但是表 A 和表 B,因为是插件自带的,所以代码中没有 model。所以外键不怎么好做。

    这种情况下,是不是手动建表 C,不使用 orm 的方式,而是直接使用原生 sql 对表 C 进行增删改查比较合适?

    或者有没有什么更好的方法?
    6 条回复    2019-06-23 22:16:15 +08:00
    wrq
        1
    wrq  
       2019-06-21 11:13:45 +08:00   ❤️ 1
    你自己给表 A B 建 orm model 不就可以了
    piaochen0
        2
    piaochen0  
    OP
       2019-06-21 11:21:33 +08:00
    @wrq 自己给第三方建 orm 的 model,migrate 的时候,不就会同步到数据库里面去了?这样会跟插件自己的库重复了吧? django 新手,求指教
    wd
        3
    wd  
       2019-06-21 11:23:54 +08:00 via iPhone
    @piaochen0 #2 第三方的按说你也可以找到他的 model 引入的吧?
    wrq
        4
    wrq  
       2019-06-21 11:38:36 +08:00
    @piaochen0 orm 是把表映射成一个对象, 就可以用操作对象的方式进行 curl. 因为 django 不知道自建的 model 在数据库中已经存在表了, 所以在加完 model 后的第一次 make migration 要加上 --fake-initial. [文档链接在这里]( https://docs.djangoproject.com/en/2.2/ref/django-admin/#cmdoption-migrate-fake-initial) ,之后就能正常 curl 了. 我也不太确定我说的对不对..
    banxi1988
        5
    banxi1988  
       2019-06-22 07:48:21 +08:00
    1. 第三方插件有 Model 找到 Model 引用.
    2. 第三方插件没有 Model 但是却会建表(一般说明不是 Django 插件). 可以自行针对表建模.
    只需要在自行建模中,设置 `managed` 选项,示例如下: (更多解释请 Google)

    ```py
    class YouModel(models.Model):
    you_field = models.CharField(...)
    class Meta:
    managed = False # 说明不需要由 Django 处理建表等操作.

    ```
    xpresslink
        6
    xpresslink  
       2019-06-23 22:16:15 +08:00
    数据库里面已经存在 AB 表的情况下,可以用直接用 sql 语句或者 GUI 工具在数据库里建 C 表。
    然后用下面命令
    python manage.py inspectdb > /project/app/models.py
    命令直接反向生成 model 代码就行了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5695 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 03:30 · PVG 11:30 · LAX 19:30 · JFK 22:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.