Удалить пользователей через ProxyModel пользовательской модели пользователя

Мой проект django реализует пользовательскую модель пользователя (MyUser). Он также реализует прокси-модель (MyUserProxy) для моего пользовательского пользователя, и я хочу использовать прокси-модель для удаления пользователей из моей базы данных. См. Модель и менеджер ниже,

проект/аккаунт/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

проект/аккаунт/managers.py

from django.contrib.auth.models import UserManager

class MyUserManager(UserManager):

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

Несколько других приложений в моем проекте имеют отношения ForeignKey с моим пользовательским пользователем (MyUser), и поэтому, когда я удаляю пользователя, записи, связанные с этим пользователем, также удаляются. Когда я указываю AUTH_USER_MODEL в моем settings.py как MyUser, тогда это работает нормально, и записи из связанных приложений удаляются вместе с пользователем.

проект/пример/settings.py

AUTH_USER_MODEL = 'account.MyUser'

Однако, когда я использую MyUserProxy для AUTH_USER_MODEL, я получаю сообщение об ошибке,

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

Django, кажется, думает, что столбец базы данных ForeignKey для приложения «otherapp» — это «myuserproxy_id», тогда как на самом деле это «myuser_id», поскольку модель MyUser указала его. Почему django связывает имя моей прокси-модели (MyUserProxy) со столбцом базы данных?

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


person sowa    schedule 19.08.2014    source источник


Ответы (1)


Оказывается, моя модель otherapp имеет отношение ManyToMany к AUTH_USER_MODEL. Отношения ManyToMany получают имя столбца, полученное из имени прокси-модели (myproxuuser_id), тогда как отношения ForeignKey получают имя столбца, полученное из проксируемой модели (myuser_id). Otherapp использует миграции, поэтому изменение имени столбца «myuser_id» не произошло, что привело к ошибке OperationalError. Для пояснения я поместил модели и результирующую структуру базы данных ниже,

проект/X/settings.py

INSTALLED_APPS = ()
    'A',
    'B',
)
AUTH_USER_MODEL = 'A.Aproxy'

проект/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

проект/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, мне непонятно.

person sowa    schedule 21.08.2014