Поле «идентификатор» ожидало номер, но получило (, Ложь)

#python #django #django-models #django-views #django-queryset

Вопрос:

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

Модель пользовательского пользователя

 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)

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

Студенческая модель

 class Student(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
 

views.py

 from django.contrib.auth.models import Group
from student.models import Student
from quiz.forms import RegistrationForm

def register_student_view(request):
    form = RegistrationForm()
    if request.method == 'POST':
        form = RegistrationForm(request.POST, request.FILES)
        if form.is_valid():
            user = form.save(commit=False)
            user.is_student = True
            user.save()
            student = Student.objects.create(user=user)
            student_group = Group.objects.get_or_create(name='STUDENT')
            student.user.groups.add(student_group)
            messages.success(request, 'Registration successful!')
            return redirect('login')

    form = RegistrationForm()
    return render(request, 'accounts/register.html', {'form': form })

 

полный путь отслеживания ошибок

 Traceback (most recent call last):
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py", line 1823, in get_prep_value
    return int(value)
TypeError: int() argument must be a string, a bytes-like object or a number, not 'tuple'

The above exception was the direct cause of the following exception:

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/student/views.py", line 29, in register_student_view
    student.user.groups.add(student_group)
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/venv/lib/python3.9/site-packages/django/db/models/fields/related_descriptors.py", line 950, in add
    self._add_items(
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/venv/lib/python3.9/site-packages/django/db/models/fields/related_descriptors.py", line 1126, in _add_items
    target_ids = self._get_target_ids(target_field_name, objs)
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/venv/lib/python3.9/site-packages/django/db/models/fields/related_descriptors.py", line 1073, in _get_target_ids
    target_ids.add(target_field.get_prep_value(obj))
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/venv/lib/python3.9/site-packages/django/db/models/fields/related.py", line 977, in get_prep_value
    return self.target_field.get_prep_value(value)
  File "/home/sharhan/DEV/PYTHON/LIVE PROJECTS/django-live/exams-app/venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py", line 1825, in get_prep_value
    raise e.__class__(
TypeError: Field 'id' expected a number but got (<Group: STUDENT>, False).
 

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

Ответ №1:

get_or_create фактически возвращает кортеж, который состоит из объекта и флага, указывающего, был ли объект создан или нет, поэтому вам нужно захватить оба и просто использовать student_group объект:

             student_group, created = Group.objects.get_or_create(name='STUDENT')
                        # ^^^ Add this
            student.user.groups.add(student_group)
 

Комментарии:

1. @bdbd Большое спасибо. Это решает мои проблемы. Я благодарен