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()
. Соответствующая документация.