一对一与相同模型django中的字段

One to One vs field in same models django

我创建了两个模板,我有扩展模板 De user (AbsctractUser) 和带有字段 total_score 的模板 (Score)。

根据我对redis的django缓存的了解,只要该行不被修改,redis就会将信息保存在缓存中。

total_score字段会定时更新,如果在AbstractUser模板中加入,每10分钟100次,这个会强制redis在每次页面变化时定时更新用户的缓存(view) ,而如果我创建第二个具有 OnetoOne 关系的 Score 模板,则该模板将仅在相关的 2 个页面上更新,或者视图加载 Score 模型。

或者我可以直接将字段 total_score 放在我的抽象用户中并定期更新它。但对我来说,抽象用户模型失去了redis的效率。 我想知道我的推理是否正确...

我能读到的是,OnetoOne 可用于扩展现有的 table,但对于创建新项目,有必要避免使用 OnetoOne,并直接在模型。 所以我一头雾水。 提前谢谢你。

示例:

更好 用于 redis 缓存 (score_user) 更新 频繁更新 行 score_user :

class User(AbstractUser):

    name = CharField(_("Last name of User"), blank=True, max_length=255)
    forename = CharField(_("First name of User"), blank=True, max_length=255)

class Score(models.Model):
    user = models.OneToOneField(User,on_delete=models.CASCADE,primary_key=True)
    score_user = models.PositiveIntegerField(default=0)

VS

class User(AbstractUser):

    name = CharField(_("Last name of User"), blank=True, max_length=255)
    forename = CharField(_("First name of User"), blank=True, max_length=255)
    score_user = models.PositiveIntegerField(default=0)

两种方法都可以,有几种方法可以 1. 为不包含 update_at 参数的缓存传递自定义密钥,您可以传递名称和名字的哈希值

  1. 只有当这些字段更新时,您才能使 post 保存挂钩中的键无效,否则忽略

将您的 Score 字段与用户分开,因为规范化了您的数据库模式。 它取决于您希望在同一页面上同时查看详细信息用户和分数的情况,并且您需要一些性能然后使用抽象用户。进行 1 次查询,您将获得一切。

您已经提到使用抽象用户会降低性能然后使用一对一关系。

并且你也可以在redis中对score做单独的hash或者string来更新score字段。不要更新用户会话哈希。

但是非规范化提高了性能。