#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 Большое спасибо. Это решает мои проблемы. Я благодарен