gpt4 book ai didi

django - 最佳实践 : Good idea to create a new table for every user?

转载 作者:行者123 更新时间:2023-12-01 01:25:47 26 4
gpt4 key购买 nike

我目前正在编写一个小的 django 应用程序来练习该框架。该应用程序允许用户登录、写入条目并查看其条目列表。
我应该如何将条目分配给创建它们的用户?为每个新用户创建一个表并将条目保存在那里是一个好主意,还是我应该只在条目模型中添加一个附加字段(例如“created_by”)并相应地过滤要显示在列表中的项目?

需要考虑的一件事是,用户绝对不能看到他自己以外的条目(例如,有人使用该应用程序写日记)。这是通过两种方式给出的吗?

我以前确实使用过数据库,所以我很感激解释为什么一种方式比另一种方式更好。

最佳答案

根据您的要求,为每个用户使用不同的数据库表会使事情变得更加困难,而且不值得进行权衡。举个例子:在“每个用户一张表”的场景中,当你去检索一个用户的信息时,你必须弄清楚该用户的表的名称是什么。我什至不确定你是怎么做的,因为关于用户的信息存储在表本身中。 (忽略 session 存储。)

当您尝试将日志条目存储在它们自己的表中并且想要保持引用完整性时,会出现更大的麻烦。也就是说,您要确保每个条目都属于实际存在的用户。对于每个用户都有一张 table ,这几乎是不可能的。

用户可以使用一张表,条目使用一张表,并且可以轻松地将两者链接起来,而不会出现任何大的、巨大的安全漏洞。您的“created_by”链接是要走的路。加载页面的 View 函数可以轻松约束用户,使他们只能看到自己的条目。这是一个这样的观点:

@login_required
def my_entries(request):
user = request.user
entries = Entry.objects.filter(created_by=user)
# return response here...

@login_required 是一个装饰器,要求访问页面的用户登录,并且对 Entry 模型的 .filter() 调用将仅加载由加载页面的用户创建的那些条目。

现在,此列表可能会链接到每个条目的“编辑”页面。每个页面的 URL 可能在 URL 中有一个唯一标识符,通常是 ID 字段。因此,创建的第一个条目自动获得 ID 1,下一个条目将获得 ID 2,依此类推,因此每个条目都有唯一的标识。因此 URL 可能看起来像“/entry/1/”、“/entry/2/”等。当页面加载时,它会检查 URL 中的 ID。如果它是“1”,则加载 ID 为“1”的条目供用户编辑。 (对不起,如果你已经知道那部分。)

但是,这意味着,更精明的用户可能会弄​​清楚 URL 是如何形成的,并开始输入自己的 ID,作为寻找其他人条目的一种方式。我可以开始输入带有随机 ID 值的 URL,直到我找到一个加载:'/entry/8/'。也许我不拥有 ID 为 8 的条目,但理论上,如果设置正确,我可以加载它。

有一些非常简单的方法可以阻止这种情况。当您编写用于加载单个条目的 View 时,不要仅通过其 ID 加载 Entry 实例...通过其 ID 和创建它的用户加载它:
@login_required
def get_entry(request, entry_id):
user = request.user
entry = Entry.objects.get(id=entry_id, created_by=user)
# return response here...

在上述情况下,如果我尝试为存在但不属于我的条目加载此页面,则会引发异常。实际上在 Django 中有一个名为“get_object_or_404”的辅助方法可以帮助解决这个问题:
@login_required
def get_entry(request, entry_id):
user = request.user
entry = get_object_or_404(Entry, id=entry_id, created_by=user)
# return response here...

现在,如果我尝试访问存在但不是我的 Entry 实例的页面,我只会看到典型的“未找到页面”错误,如果我尝试访问未找到的页面,Django 会提供该错误存在。

我知道您的问题与用户数据库表有关,但我希望这有助于您配置 Django,以便您的用户不会读取/编辑彼此的数据。

关于django - 最佳实践 : Good idea to create a new table for every user?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5040978/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com