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

2019-06-21 09:36:16 +08:00
 piaochen0
我们的项目用了一些第三方的插件,会在数据库里生成一些表,例如表 A,B。我最近做的功能,自己建的表 C,表 C 里两个字段,会外键到表 A,B 的 ID。

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

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

或者有没有什么更好的方法?
1605 次点击
所在节点    Python
6 条回复
wrq
2019-06-21 11:13:45 +08:00
你自己给表 A B 建 orm model 不就可以了
piaochen0
2019-06-21 11:21:33 +08:00
@wrq 自己给第三方建 orm 的 model,migrate 的时候,不就会同步到数据库里面去了?这样会跟插件自己的库重复了吧? django 新手,求指教
wd
2019-06-21 11:23:54 +08:00
@piaochen0 #2 第三方的按说你也可以找到他的 model 引入的吧?
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
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
2019-06-23 22:16:15 +08:00
数据库里面已经存在 AB 表的情况下,可以用直接用 sql 语句或者 GUI 工具在数据库里建 C 表。
然后用下面命令
python manage.py inspectdb > /project/app/models.py
命令直接反向生成 model 代码就行了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/576073

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX