我刚刚开始学习Python Django,并且拥有使用PHP和MySQL构建高流量网站的丰富经验。到目前为止,我担心的是Python过于乐观的方法,您永远不需要编写自定义SQL,并且它会自动在您的数据库中创建所有这些外键关系。我在构建Chess.com的最后几年中学到的一件事是,当你处理MySQL之类的东西时,不可能不编写自定义SQL,经常需要告诉它应该使用哪些索引(或避免使用) ,外国钥匙被判死刑。 Percona最强烈的建议是让我们删除所有FK以获得最佳性能。
Django有没有办法在模型文件中执行此操作?创建关系而不创建实际的DB FK?或者有没有办法从数据库级别开始,设计/创建我的数据库,然后让Django对模型文件进行逆向工程?
答案 0 :(得分:1)
如果您不想要外键,请避免使用
models.ForeignKey()
,models.ManyToManyField()
和models.OneToOneField()
。 Django将自动创建一个名为id
的自动增量int字段,您可以使用该字段来引用单个记录,或者您可以通过将字段标记为primary_key=True
来覆盖该字段。
答案 1 :(得分:1)
Raw SQL就像这样简单:
for obj in MyModel.objects.raw('SELECT * FROM myapp_mymodel'):
print obj
在模型定义时,数据库的非规范化取决于您。
您也可以使用非关系数据库(MongoDB,...)和Django NonRel
答案 2 :(得分:0)
django-admin inspectdb允许您从现有表中对模型文件进行反向工程。这只是对你的问题的非常局部的回应;)
答案 3 :(得分:0)
您可以创建model.py并避免让SQL Alchemy自动创建表格,让您根据需要定义实际表格。因此,尽管model.py中存在外键关系,但这并不意味着它们必须存在于实际表中。考虑到在MySQL中实现了多么荒谬的外键约束,这是一件非常好的事情--MyISAM只是忽略了它们,InnoDB在每一个都创建了一个非可选索引,无论它是否有意义。
答案 4 :(得分:0)