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

Python 在Django 1.8的Mysql中使用自定义用户数据库结构,python,mysql,django,Python,Mysql,Django,如果我使用MySQL数据库扩展它的功能,我对用户的表结构有一个问题 给定models.py文件 我有一个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(

如果我使用MySQL数据库扩展它的功能,我对用户的表结构有一个问题

给定models.py文件

我有一个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'")

您缺少的是,默认情况下,django模型自动包含一个映射到models.AutoField的id字段

您需要指定DB表id是用户id而不是id。

您希望将您的用户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)
使用

user=models.onetoonefeelduser,主键=True

i、 e.在属性名称中删除_id

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

对包含字段的模型使用一对一关系 有关更多信息,请参阅。这种一对一的模式通常被称为 概要文件模型,因为它可能存储有关 网站用户。例如,您可以创建LibraryUser模型:

假设现有的LibraryUser Fred Smith同时拥有用户和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)

所有这些都取自

,您应该使用django迁移来处理SQL。检查此项:。除非需要,否则不要创建自己的SQL。只需创建模型并运行./manage.py makemigrations&./manage.py migrate。linkHello@BogdanIulianBursuc中的更多信息问题是,我正在将Django集成到一个现有的应用程序和一组现有的库用户中。因此,我想利用用户模型进行身份验证。然后检查如何扩展用户模型use User=models.onetoonefelduser,primary_key=True,即在属性nameHi@Pynchia中删除_id让我在关闭此解决方案之前尝试一下?嘿!我认为你的解决方案是正确的。我使用了user,而不是user\u id。在我给你正确的标志之前,让我确认一下这是否正确?你是对的。仅使用user而不是user_id也可以解决另一个问题。因为django用_id作为关系字段的后缀
>>> 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)