【问题标题】:Delete users through ProxyModel of custom User model通过自定义User模型的ProxyModel删除用户
【发布时间】:2014-10-12 16:29:46
【问题描述】:

我的 django 项目实现了一个自定义用户模型 (MyUser)。它还为我的自定义用户实现了一个代理模型(MyUserProxy),我想使用代理模型从我的数据库中删除用户。请参阅下面的模型和经理,

project/account/models.py

from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
from django.db import models    
from .managers import MyUserManager

class MyUser(AbstractUser, PermissionsMixin):

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email']

    username = models.CharField(max_length=255, unique=True)
    email = models.CharField(max_length=255, unique=True)
    ...

    objects = MyUserManager()

    class Meta():
        verbose_name = _('My user')
        verbose_name_plural = _('My users')

    def __unicode__(self):
        return self.username

class MyUserProxy(MyUser):

    class Meta():
        proxy = True

project/account/managers.py

from django.contrib.auth.models import UserManager

class MyUserManager(UserManager):

    def __init__(self, *args, **kwargs):
        super(MyUserManager, self).__init__(*args, **kwargs)

我的项目中的几个其他应用程序与我的自定义用户 (MyUser) 有 ForeignKey 关系,因此当我删除一个用户时,与该用户相关的记录也会被删除。当我在我的 settings.py 中将 AUTH_USER_MODEL 指定为 MyUser 时,这样就可以正常工作,并且来自相关应用的记录会随用户一起删除。

project/example/settings.py

AUTH_USER_MODEL = 'account.MyUser'

但是,当我为 AUTH_USER_MODEL 使用 MyUserProxy 时,我收到了一个错误,

OperationalError: (1054, "Unknown column 'otherapp.myuserproxy_id'
in 'where clause'")

Django 似乎认为应用程序“otherapp”的 ForeignKey 数据库列是“myuserproxy_id”,而实际上是“myuser_id”,因为模型 MyUser 指定了它。为什么 django 将我的代理模型 (MyUserProxy) 的名称与数据库列相关联?

https://docs.djangoproject.com/en/dev/topics/db/models/#proxy-models

【问题讨论】:

    标签: django python-2.6


    【解决方案1】:

    事实证明,我的其他应用模型与 AUTH_USER_MODEL 具有多对多关系。 ManyToMany 关系获取从代理模型名称 (myproxuuser_id) 派生的列名,而 ForeignKey 关系从被代理的模型 (myuser_id) 获取列名。其他应用程序使用迁移,因此未发生列名“myuser_id”的更改,从而导致 OperationalError。为了澄清起见,我将模型和生成的数据库结构放在下面,

    项目/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
    

    project/B/models.py

    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 为 ManyToMany 字段应用不同的列名,但我不清楚。

    【讨论】:

      猜你喜欢
      • 2016-04-27
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-24
      • 2021-06-29
      • 2018-11-09
      • 1970-01-01
      相关资源
      最近更新 更多