Не удается преобразовать ключевое слово 'approve_moderator' в поле. Варианты: id, user, user_id

Синопсис проблемы:

Я реализую логику входа, которая проверяет, зарегистрирован ли пользователь и находится ли он в группе MODERATOR (пользователь автоматически добавляется в группу MODERATOR при регистрации) со статусом "approve_moderator", установленным в True. По умолчанию поле "approve_moderator" имеет значение False. Теперь при входе в систему я проверяю, является ли пользователь зарегистрированным и одобрен ли он, прежде чем перенаправить его на панель модератора

views.py


def is_moderator(user):
    '''check if registered and in moderator group'''
    return user.groups.filter(name='MODERATOR').exists()

def afterlogin_view(request):
    if is_student(request.user):
        messages.success(request, 'successfully logged in as ' + request.user.username)
        return redirect('student-dashboard')

    elif is_moderator(request.user):
        approval_status = Moderator.objects.all().filter(user_id=request.user.id, approve_moderator=True)
        if approval_status:
            return redirect('moderator-dashboard')
        else:
            return redirect('moderator-wait-approval')
    elif is_admin(request.user):
        return redirect('admin-dashboard')
    else:
        return redirect('login')

def register_moderator_view(request):
    if request.user.is_authenticated and request.user.is_moderator:
        return redirect('moderator-dashboard')
    else:
        form = RegistrationForm()
        if request.method == 'POST':
            form = RegistrationForm(request.POST, request.FILES)
            if form.is_valid():
                user = form.save(commit=False)
                user.is_moderator = False
                user.save()
                moderator = Moderator.objects.create(user=user)
                moderator_group, created = Group.objects.get_or_create(name='MODERATOR')
                moderator.user.groups.add(moderator_group)
                messages.info(request, 'Registration successful!')
                return redirect('login')
            # else:
            #     messages.warning(request, 'Form invalid!')
        form = RegistrationForm()
    return render(request, 'accounts/register.html', {'form': form })

models.py

class CustomUser(AbstractUser):
    email = models.EmailField(_('email address'), unique=True)
    phone = models.CharField(max_length=150, null=True, blank=True)
    address = models.CharField(max_length=200, null=True, blank=True)
    profile_picture = models.ImageField(default='images/student.png', upload_to='profile_picture/', null=True, blank=True)
    is_student = models.BooleanField(default=False)
    is_moderator = models.BooleanField(default=False)
    is_administrator = models.BooleanField(default=False)
    approve_moderator = models.BooleanField(default=False)

    def __str__(self):
        return self.get_username()

class Moderator(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

    @property
    def get_instance(self):
        return self

    def __str__(self):
        return self.user.username

полное отслеживание

Internal Server Error: /afterlogin/
Traceback (most recent call last):
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/venv/lib/python3.9/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/venv/lib/python3.9/site-packages/django/core/handlers/base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/quiz/views.py", line 45, in afterlogin_view
    approval_status = Moderator.objects.all().filter(user_id=request.user.id, approve_moderator=True)
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/venv/lib/python3.9/site-packages/django/db/models/query.py", line 941, in filter
    return self._filter_or_exclude(False, args, kwargs)
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/venv/lib/python3.9/site-packages/django/db/models/query.py", line 961, in _filter_or_exclude
    clone._filter_or_exclude_inplace(negate, args, kwargs)
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/venv/lib/python3.9/site-packages/django/db/models/query.py", line 968, in _filter_or_exclude_inplace
    self._query.add_q(Q(*args, **kwargs))
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/venv/lib/python3.9/site-packages/django/db/models/sql/query.py", line 1393, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/venv/lib/python3.9/site-packages/django/db/models/sql/query.py", line 1412, in _add_q
    child_clause, needed_inner = self.build_filter(
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/venv/lib/python3.9/site-packages/django/db/models/sql/query.py", line 1286, in build_filter
    lookups, parts, reffed_expression = self.solve_lookup_type(arg)
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/venv/lib/python3.9/site-packages/django/db/models/sql/query.py", line 1112, in solve_lookup_type
    _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta())
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/venv/lib/python3.9/site-packages/django/db/models/sql/query.py", line 1539, in names_to_path
    raise FieldError("Cannot resolve keyword '%s' into field. "
django.core.exceptions.FieldError: Cannot resolve keyword 'approve_moderator' into field. Choices are: id, user, user_id

Вы фильтруете для Moderator, который имеет approved_moderator=True для связанного пользователя, а не самого Moderator, поэтому вы должны фильтровать с:

approval_status = Moderator.objects.filter(
    user_id=request.user.id,
    user__approve_moderator=True
)
Вернуться на верх