Python Django支持自定义SQL和无外键关系的非规范化数据库吗?

2 投票
5 回答
675 浏览
提问于 2025-04-16 00:07

我刚开始学习Python的Django框架,之前用PHP和MySQL搭建过很多高流量的网站。现在让我担心的是,Python似乎总是乐观地认为你不需要写自定义的SQL,而且它会自动在你的数据库中创建所有这些外键关系。过去几年在Chess.com的开发中,我学到的一件事就是,当你使用MySQL时,几乎不可能不写自定义的SQL,因为你经常需要告诉它应该使用(或避免使用)哪些索引,而外键关系则会让事情变得复杂。Percona给我们的最强烈建议就是去掉所有外键,以获得最佳性能。

在Django中,有没有办法在模型文件中创建关系,而不实际在数据库中创建外键?或者有没有办法从数据库层面开始,先设计/创建我的数据库,然后让Django反向生成模型文件?

5 个回答

0

django-admin inspectdb 这个命令可以让你从已经存在的数据库表中生成模型文件。这个回答只是对你问题的一部分哦;)

1

如果你不想使用外键,那就别用以下这些:

  • models.ForeignKey()
  • models.ManyToManyField(),还有
  • models.OneToOneField()

Django会自动创建一个名为id的自增整数字段,你可以用它来指代每一条记录。如果你想用其他字段来代替这个id,可以通过把那个字段标记为primary_key=True来实现。

另外,还有关于在数据库上运行原始SQL查询的文档。

1

原始SQL就简单到这个程度:

for obj in MyModel.objects.raw('SELECT * FROM myapp_mymodel'):
    print obj

在定义模型的时候,是否要对数据库进行非规范化(也就是简化结构)由你自己决定。

你也可以使用非关系型数据库(比如MongoDB等),并且可以通过Django NonRel来实现。

撰写回答