【问题标题】:Design question: How would you design a temporary user table?设计问题:如何设计临时用户表?
【发布时间】:2020-11-24 23:12:57
【问题描述】:

我正在设计一个网站,允许体育教练创建团队,然后将球员添加到该团队。目标是允许教练将球员添加到他们的球队中,并通过输入比赛数据将统计数据与他们相关联。

我遇到的问题是球员能够创建自己的帐户并将他们的帐户与教练创建的一名球员相关联。教练将能够输入球员帐户的唯一 ID 并选择他在球队中创建的球员,并允许球员访问他为“假”用户输入的统计数据。此时假用户将被删除。我解决这个问题的初步设计如下:

我将使用默认的“用户”表,并通过 OneToOneField 将其链接到“配置文件”表。每当教练为他们的球队创建一名球员时,都会创建一个用户和一个相关的个人资料。假用户将有一个 UUIDField 作为 Profile 表中的 ID。我按如下方式存储玩家的统计数据:

class Stats(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    match = models.ForeignKey(Match, on_delete=models.CASCADE)
    player = models.ForeignKey(User, on_delete=models.CASCADE)
    ...
    ... several stats as IntegerFields

Stats 表会将假用户作为参数,并将统计信息与该用户相关联。当真实用户创建账号,教练输入他们的UUID并选择假用户时,Stats中的“玩家”字段将被真实用户替换,假用户将被删除。

我的问题是,这是解决此问题的最佳方法吗?用没有用户名或密码的用户污染用户表感觉不好(甚至允许这样做吗?),但如果为假用户制作单独的表,我相信玩家字段会有问题。

player = models.ForeignKey(User, on_delete=models.CASCADE)

player 字段将 stats 表与 User 表相关联,并且需要一个 User 对象。如果它与假用户条目相关,我将无法将其分配给真正的玩家,因为它不是假用户对象。

我确定这个问题有一个我不知道的名称,因为它一定是 Django 中的常见问题。

【问题讨论】:

    标签: django database postgresql sqlite django-models


    【解决方案1】:

    在这种情况下,我根本不会使用临时表(模型)。相反,我建议您创建一个 Player 模型,该模型具有 UUID 字段和一个指向 User(null=True) 的 OneToOneField。 Stats.player 应该指向 Player 模型。然后当玩家在网站上注册时,只需将 request.user 分配给 player.user。

    由于您有两种类型的用户,球员和教练,因此为球员提供不同的“个人资料”是有意义的。该玩家的“个人资料”是Player 模型。

    【讨论】:

    • 谢谢,这是一个很好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多