Django 外键关系应该是用户到模型还是模型到用户?

Posted

技术标签:

【中文标题】Django 外键关系应该是用户到模型还是模型到用户?【英文标题】:Should Django foreign key relationships be user to model or model to user? 【发布时间】:2021-09-11 10:41:07 【问题描述】:

我是 django 新手,正在尝试制作一个电子商务网站以供练习。有一个Cart 模型,它当前有一个指向UserForeignKey。哪种方式效率更高?

我应该创建一个 UserProfile 模型,该模型将 Cart 作为 ForeignKey 还是应该这样保留它?

我认为前者应该更快,因为当我向用户显示购物车时,如果我保持原样,它将必须搜索和过滤所有购物车。但是我正在观看的教程正在设置他们的模型,其中 Cart 对用户有一个 ForeignKey。

【问题讨论】:

Cart 应该将 UserProfile 作为 FK。如果购物车与 UserProfile 是一对一的关系,也可以使用 OneToOneField。 @ÇağatayBarın 你能解释一下它如何更有效,因为它必须搜索所有购物车才能找到用户的购物车。大数据库的网站也是这样设置的吗? 【参考方案1】:

我在评论中写了这个,但结果比允许的字符数长。

回答您的问题:Can you explain how is it more efficient as it will have to search through all the carts to find the user's cart. Do websites with big database also have it set up like this?

是的,他们有。如果您将购物车作为 FK 添加到 UserProfile,它不应该更快,因为它只保存对该购物车实例的引用。您仍然必须转到 Cart 表并检索相关行。您必须注意的是控制对数据库进行的查询数量。要跟踪它,您可以使用 django-debug-toolbar,或使用 shell 对其进行调试。

from django.db import connection
queries=connection.queries

print(f"QUERY: len(queries)")

然后检查查询的长度及其详细信息以进行调试并使其更快。此外,尽可能使用select_relatedprefetch_related,这将显着减少查询次数。

Django 调试工具栏是这样的

当您点击SQL 时,您将看到所有查询的详细信息,并能够看到重复的查询。

【讨论】:

以上是关于Django 外键关系应该是用户到模型还是模型到用户?的主要内容,如果未能解决你的问题,请参考以下文章

Django,在模型外键中按组过滤用户

如何使用 Graphene-Django Relay 中的外键关系更新模型?

通过django模板中的外键关系快速访问模型属性

关于自定义用户模型的 Django 最佳实践

Django - 显示结果信息,同时使用具有多个外键关系的模型优化数据库查询

如何在django中上传csv文件的函数中使用外键连接模型?