Django 通过自定义用户模型的ProxyModel删除用户
我的django项目实现了一个自定义用户模型MyUser。它还为我的自定义用户实现了一个proxymodel MyUserProxy,我想使用proxymodel从数据库中删除用户。请参见下面的模型和管理器 project/account/models.pyDjango 通过自定义用户模型的ProxyModel删除用户,django,python-2.6,Django,Python 2.6,我的django项目实现了一个自定义用户模型MyUser。它还为我的自定义用户实现了一个proxymodel MyUserProxy,我想使用proxymodel从数据库中删除用户。请参见下面的模型和管理器 project/account/models.py from django.db import models class A(models.Model): USERNAME_FIELD = 'field1' REQUIRED_FIELDS = ['field2']
from django.db import models
class A(models.Model):
USERNAME_FIELD = 'field1'
REQUIRED_FIELDS = ['field2']
field1 = models.CharField(max_length=255, unique=True)
field2 = models.CharField(max_length=255, unique=True)
def __init__(self, *args, **kwargs):
super(A, self).__init__(*args, **kwargs)
class AProxy(A):
class Meta():
proxy = True
from django.db import models
from django.conf import settings
from A.models import A
class B(models.Model):
a = models.OneToOneField(settings.AUTH_USER_MODEL)
field1 = models.CharField(max_length=255, unique=True)
field2 = models.CharField(max_length=255, unique=True)
mtm = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='mtm')
def __init__(self, *args, **kwargs):
super(B, self).__init__(*args, **kwargs)
项目/账户/经理.py
我的项目中的其他几个应用程序与我的自定义用户MyUser有ForeignKey关系,因此当我删除一个用户时,与该用户相关的记录也会被删除。当我在my settings.py中将AUTH_USER_模型指定为MyUser时,这一切正常,相关应用程序的记录会随用户一起删除
project/example/settings.py
INSTALLED_APPS = ()
'A',
'B',
)
AUTH_USER_MODEL = 'A.Aproxy'
但是,当我对AUTH_USER_模型使用MyUserProxy时,我得到一个错误
OperationalError: (1054, "Unknown column 'otherapp.myuserproxy_id'
in 'where clause'")
Django似乎认为应用otherapp的ForeignKey数据库列是myuserproxy_id,而实际上是myuser_id,因为模型myuser指定了它。为什么django将我的proxymodel MyUserProxy的名称与数据库列相关联
事实证明,我的otherapp模型与AUTH_USER_模型有很多关系。许多关系获取从proxymodel名称MyProxUser_id派生的列名,而ForeignKey关系获取从代理myuser_id的模型派生的列名。Otherapp使用迁移,因此列名myuser_id没有发生更改,从而导致操作错误。为了澄清,我将模型和结果数据库结构放在下面 项目/X/settings.py
INSTALLED_APPS = ()
'A',
'B',
)
AUTH_USER_MODEL = 'A.Aproxy'
project/A/models.py
from django.db import models
class A(models.Model):
USERNAME_FIELD = 'field1'
REQUIRED_FIELDS = ['field2']
field1 = models.CharField(max_length=255, unique=True)
field2 = models.CharField(max_length=255, unique=True)
def __init__(self, *args, **kwargs):
super(A, self).__init__(*args, **kwargs)
class AProxy(A):
class Meta():
proxy = True
from django.db import models
from django.conf import settings
from A.models import A
class B(models.Model):
a = models.OneToOneField(settings.AUTH_USER_MODEL)
field1 = models.CharField(max_length=255, unique=True)
field2 = models.CharField(max_length=255, unique=True)
mtm = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='mtm')
def __init__(self, *args, **kwargs):
super(B, self).__init__(*args, **kwargs)
项目/B/models.py
from django.db import models
class A(models.Model):
USERNAME_FIELD = 'field1'
REQUIRED_FIELDS = ['field2']
field1 = models.CharField(max_length=255, unique=True)
field2 = models.CharField(max_length=255, unique=True)
def __init__(self, *args, **kwargs):
super(A, self).__init__(*args, **kwargs)
class AProxy(A):
class Meta():
proxy = True
from django.db import models
from django.conf import settings
from A.models import A
class B(models.Model):
a = models.OneToOneField(settings.AUTH_USER_MODEL)
field1 = models.CharField(max_length=255, unique=True)
field2 = models.CharField(max_length=255, unique=True)
mtm = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='mtm')
def __init__(self, *args, **kwargs):
super(B, self).__init__(*args, **kwargs)
结果在表结构中
A_a
+----+--------+--------+
| id | field1 | field2 |
+----+--------+--------+
B_b
+----+------+--------+--------+
| id | a_id | field1 | field2 |
+----+------+--------+--------+
B_b_mtm
+----+------+-----------+
| id | b_id | aproxy_id |
+----+------+-----------+
| 1 | 1 | 1 |
+----+------+-----------+
为什么django对许多字段应用不同的列名,我不清楚