如果我使用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'")
答案 0 :(得分:0)
您缺少的是默认情况下,django模型会自动包含映射到models.AutoField()的id
字段。
您需要指定数据库表ID为user_id
而不是id
。
https://docs.djangoproject.com/en/1.8/topics/db/models/#automatic-primary-key-fields
您希望将user_id
作为主键。它应该通过向该字段添加primary_key=True
来实现,例如:
class LibraryUser(models.Model):
user_id = models.OneToOneField(User, primary_key=True)
is_catalogue_subscriber = models.IntegerField(default=1)
is_research_subscriber = models.IntegerField(default=1)
library_membership_number = models.CharField(max_length=64)
答案 1 :(得分:0)
使用
user = models.OneToOneField(User, primary_key=True)
即。将_id放在属性名称中。
如果您只想定义更丰富的用户模型(即添加更多属性),您可以
与包含字段的模型使用一对一的关系 了解更多信息。这种一对一的模型通常被称为a 配置文件模型,因为它可能存储有关a的非身份验证相关信息 网站用户。例如,您可以创建一个LibraryUser模型:
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
然后将配置文件模型的字段添加到admin do
中的用户页面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