python - 在 Django 1.8 的 Mysql 中使用自定义用户数据库结构

标签 python mysql django

如果我要使用 MySQL 数据库扩展其功能,我对 User 的表结构有疑问。

给定models.py文件

class LibraryUser(models.Model):
  user_id = models.OneToOneField(User)
  is_catalogue_subscriber = models.IntegerField(default=1)
  is_research_subscriber = models.IntegerField(default=1)
  library_membership_number = models.CharField(max_length=64)

我有一个 SQL 表结构

CREATE TABLE library_user(
  user_id int(10) primary key
  is_catalogue_subscriber integer(1) DEFAULT 1
  is_research_subscriber = integer(1) DEFAULT 1
  library_membership_number = varchar(16)
)

现在,当我启动服务器并访问管理页面中的帐户时,Django 会抛出错误:

Exception Type: OperationalError
Exception Value:    
(1054, "Unknown column 'library_user.id' in 'where clause'")

最佳答案

使用

user = models.OneToOneField(User, Primary_key=True)

即删除属性名称中的 _id。

如果您只是想定义更丰富的用户模型(即添加更多属性),您可以

use a one-to-one relationship to a model containing the fields for additional information. This one-to-one model is often called a profile model, as it might store non-auth related information about a site user. For example you might create a LibraryUser model:

from django.contrib.auth.models import User

class LibraryUser(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    is_catalogue_subscriber = models.IntegerField(default=1)
    is_research_subscriber = models.IntegerField(default=1)
    library_membership_number = models.CharField(max_length=64)

假设现有 LibraryUser Fred Smith 同时拥有 User 和 LibraryUser 模型,您可以使用 Django 的标准相关模型约定来访问相关信息:

>>> u = User.objects.get(username='fsmith')
>>> freds_department = u.libraryuser.department

然后将配置文件模型的字段添加到管理中的用户页面

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User

from my_user_profile_app.models import LibraryUser

# Define an inline admin descriptor for Employee model
# which acts a bit like a singleton
class LibraryUserInline(admin.StackedInline):
    model = LibraryUser
    can_delete = False
    verbose_name_plural = 'libraryuser'

# Define a new User admin
class UserAdmin(UserAdmin):
    inlines = (LibraryUserInline, )

# Re-register UserAdmin
admin.site.unregister(User)
admin.site.register(User, UserAdmin)

全部取自official docs

关于python - 在 Django 1.8 的 Mysql 中使用自定义用户数据库结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33051472/

相关文章:

python - 如何打印sqlite3数据库中的数据?

php - 使用 INSERT DATEDIFF 接收语法错误

mysql - SQL/MySQL : Two statements in one query

带有查询集的 Django 表单 ChoiceField

python - 如何使用 PyArrow 从 s3 读取定义的 Parquet 文件列表?

Python NumPy - FFT 和逆 FFT?

python - 如何根据索引值生成列表

mysql - View 更改有什么问题?

django - 你如何要求在 Django 中登录媒体文件

Django:站点范围的 URL 前缀