在Django中创建自定义用户后端

时间:2011-02-25 16:01:49

标签: django inheritance model

我有一个Shops模型,希望每个商店都能登录我的应用程序。我尽可能地在http://scottbarnham.com/blog/2008/08/21/extending-the-django-user-model-with-inheritance/以及其他各种Google搜索引导,我已经有了部分路线,但我遇到了一个问题。当我尝试作为商店登录时,我收到以下错误:

OperationalError at /login/
(1054, "Unknown column 'shops.user_ptr_id' in 'field list'")

商店模特:

class Shops(User):
  shop_id = models.AutoField(primary_key=True)
  shop_code = models.CharField(unique=True, max_length=5)
  shop_type_fk = models.ForeignKey(ShopTypes,
                                   null=True,
                                   db_column='shop_type_id',
                                   blank=True)
  address_fk = models.ForeignKey(Addresses, db_column='address_id')
  phone_number = models.CharField(max_length=30)
  #email = models.EmailField(max_length=255, blank=True)
  description = models.TextField(blank=True)
  does_gift_aid = models.NullBooleanField(null=True, blank=True)
  objects = UserManager()
  class Meta:
    db_table = u'shops'

我已经同步了数据库,所以它肯定应该是列user_ptr_id。有谁知道我哪里出错了?

2 个答案:

答案 0 :(得分:2)

  

“我已经同步了数据库,所以肯定应该将列设为user_ptr_id。”

是什么让你这么想?特别是根据这一明确的陈述in the docs for syncdb

  

Syncdb不会改变现有的表

     

syncdb只会为其创建表   还没有的模型   安装。它永远不会发出ALTER   TABLE语句以匹配所做的更改   安装后到模型类。   对模型类和数据库的更改   模式通常涉及某种形式   模棱两可,在这些情况下,Django   将不得不猜测正确   改变。存在风险   关键数据将丢失   过程

     

如果您对模型进行了更改   并希望改变数据库表   要匹配,请使用sql命令   显示新的SQL结构和   将其与现有表格进行比较   模式来计算更改。

答案 1 :(得分:1)

听起来好像你有一个现有的商店表,然后再将它改为继承自User(如Daniel所说),而syncdb不会更新现有表的模式。

如果可能,您需要删除表,然后运行syncdb。否则,如果您知道如何操作,则需要进入数据库并手动添加user_ptr_id字段。定义应如下所示:

"user_ptr_id" integer NOT NULL UNIQUE REFERENCES "auth_user" ("id")