0

ユーザーがアカウントを削除したら、ユーザー名を利用できるようにしようとしています。デフォルトでは、ユーザー名は一意であるため、アカウントが論理的に削除された後でもユーザー名は使用できません。

これは、デフォルトで、箱から出してすぐに使用できる django に付属するセットアップです。

class CustomUser(AbstractUser):
    username = models.CharField(
        _('username'),
        max_length=150,
        unique=True,
        help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),
        validators=[UnicodeUsernameValidator()],
        error_messages={
            'unique': _("A user with that username already exists."),
        },
    )
    is_active = models.BooleanField(
        _('active'),
        default=True,
        help_text=_(
            'Designates whether this user should be treated as active. '
            'Unselect this instead of deleting accounts.'
        ),
    )

is_activeここでは、モデルを削除済みとしてマークするために使用されます。

条件を利用して追加できるようにするにUniqueConstraintは、ユーザー名の一意性を削除する必要があります。

class CustomUser(AbstractUser):
    username = models.CharField(
        _('username'),
        max_length=150,
        unique=False,
        help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),
        validators=[UnicodeUsernameValidator()],
        error_messages={
            'unique': _("A user with that username already exists."),
        },
    )
    is_active = models.BooleanField(
        _('active'),
        default=True,
        help_text=_(
            'Designates whether this user should be treated as active. '
            'Unselect this instead of deleting accounts.'
        ),
    )

    class Meta:
        constraints = [
            models.UniqueConstraint(
                fields=['username'],
                name='active_username_constraint',
                condition=models.Q(is_active=True)
            )
        ]

これは登録に対して機能します。ユーザーがアカウントを削除した後、ユーザー名は登録時に再利用できます。ただし、ユーザーがログインすると、次のエラーが発生します。

MultipleObjectsReturned at /api/vdev/login/
get() returned more than one CustomUser -- it returned 2!

is_activeユーザーが認証プロセスの一部であるかどうかを確認する方法を見つけようとしています。これを行う方法はありますか?

4

1 に答える 1