Django:扩展用户模型避免数据库连接

Posted

技术标签:

【中文标题】Django:扩展用户模型避免数据库连接【英文标题】:Django: extending User model avoiding DB join 【发布时间】:2012-12-14 11:27:39 【问题描述】:

在我的 Django 应用程序中,我需要创建一个包含一些额外字段的用户模型。对于数据库性能,我想避免每次我想访问这些字段时加入。在数据库级别,我想在用户表上生成一个 ALTER TABLE 以添加这些字段,或者甚至创建一个包含应用程序初始化所需的所有字段的 CREATE TABLE 都可以,因为我仍在开发中。

我找到了两种扩展用户模型的解决方案(如下所述),但两者都与我避免 JOIN 的选择不一致。

models.py (Solution 1)
from django.db import models

class Person(models.Model):
    # Aggregate using a OneToOneField on User
    user = models.OneToOneField(User)
    age = models.PositiveSmallIntegerField()

models.py (Solution 2)
from django.contrib.auth.models import User

class Person(User):
     # Inheriting from User
     age = models.PositiveSmallIntegerField() 

SQL (Solution 1)
/* Aggregate using a OneToOneField on User */
BEGIN;
CREATE TABLE "people_person" (
 "id" integer NOT NULL PRIMARY KEY,
 "user_id" integer NOT NULL UNIQUE REFERENCES "auth_user" ("id"),
 "age" smallint unsigned NOT NULL
);
 COMMIT;

SQL (Solution 2)
/* Inheriting from User */
BEGIN;
CREATE TABLE "people_person" (
 "user_ptr_id" integer NOT NULL PRIMARY KEY REFERENCES "auth_user" ("id"),
 "age" smallint unsigned NOT NULL
);
 COMMIT;

【问题讨论】:

【参考方案1】:

从 django 1.5 开始,可以替换用户模型而不是扩展它。

https://docs.djangoproject.com/en/dev/releases/1.5/#configurable-user-model

在 django 1.4 或更早的版本中,用户的“profile”属性会获得一些特殊的缓存,这可能会或可能不会满足您的要求。

【讨论】:

以上是关于Django:扩展用户模型避免数据库连接的主要内容,如果未能解决你的问题,请参考以下文章

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

Django - 查询外键 ID 时避免连接?

08 django模型系统

django第六课 模型第一讲

Django模型,models

django配置模型增删改查