在Mysql中为Django 1.8

时间:2015-10-10 07:27:52

标签: 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'")

2 个答案:

答案 0 :(得分:0)

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

您需要指定数据库表ID为user_id而不是idhttps://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