Django.db.utils.ProgrammingError: не удается адаптировать тип 'User' только в Postgres

У меня очень странная ошибка, которую я не могу понять. Я решил, как ее устранить, но это может быть странной ошибкой для других, поэтому я все равно пишу.

У меня есть функция представления, которая позволяет пользователям приглашать членов команды в свою команду.

@login_required
def invite_team_member(request):
    if request.method == "POST":
        form = forms.InviteTeamMemberForm(request.POST, team=request.user.profile.team)
        if form.is_valid():
            user = form.clean_username_or_email()
            try:
                models.TeamInvite.objects.create(from_user=request.user, to_user=user, team=request.user.profile.team)
                message = _("User successfully invited")
            except IntegrityError:
                message = _("This user has already been invited to your team")
            except ValidationError as e:
                if e.code == "team_full":
                    message = _("Your team is full, no further users can be invited")
                else:
                    raise e

            return render(
                request,
                "tracker/tracker_home/invite_team_member.html",
                {"invite_team_member_form": form, "message": message},
            )
    else:
        form = forms.InviteTeamMemberForm(team=request.user.profile.team)
    return render(request, "tracker/tracker_home/invite_team_member.html", {"invite_team_member_form": form})

Пользователи вводят в форму имя пользователя или email, а форма определяет, правомерно ли приглашать пользователя с таким именем пользователя или email.

class InviteTeamMemberForm(forms.Form):
    username_or_email = forms.CharField(label=_("Username or Email"))

    def __init__(self, *args, **kwargs):
        self.team: models.Team = kwargs.pop("team")
        super().__init__(*args, **kwargs)

    def clean_username_or_email(self):
        data = self.cleaned_data["username_or_email"]

        try:
            user = User.objects.get(Q(username__iexact=data) | Q(email__iexact=data))
            if user.profile.team == self.team:
                raise ValidationError(_("This user cannot be invited since they are already on this team"))
            return user
        except User.DoesNotExist:
            raise ValidationError(_("A user with that username or email doesn't exist."))

Вот здесь все становится странным. Все это отлично работает с базой данных Sqlite, но при использовании Postgres возникает вот такой стектрейс.

Я не могу понять, происходит ли что-то за кулисами, что я упускаю. Если просмотреть код, то база данных прекрасно извлекает пользователя при выполнении user = User.objects.get(Q(username__iexact=data) | Q(email__iexact=data)), но когда пользователь возвращается в представление с помощью form.clean_username_or_email(), возникает ошибка. Опять же, это происходит только с postgres, но не с sqlite.

Если у кого-нибудь есть понимание того, что здесь происходит, дайте мне знать. Я предполагаю, что form.clean_username_or_email() не предназначен для вызова непосредственно из функции представления. Но все же странно, что при этом возникает ошибка, специфичная для базы данных.

Решением для меня было использование user = form.cleaned_data["username_or_email"] вместо user = form.clean_username_or_email(). Соответствующая документация.

Вернуться на верх