字段 'id' 需要一个数字但得到了 (<Group: STUDENT>, False)
Field 'id' expected a number but got (<Group: STUDENT>, False)
我有一个注册表单,我想在其中注册一个学生并实例化一个学生模型并将它们添加到该模型中。我有一个 CustomUser 模型,它被 Student 模型引用。
自定义用户模型
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 并直接从中调用用户。我希望用户位于具有指向 CustomUser 的外键的 Student 模型中,而不是从 CustomUser 调用用户,然后我可以使用 Student 实例执行我的业务逻辑。
get_or_create
实际上是 returns 一个元组,它由对象和一个表示对象是否已创建的标志组成,所以你需要捕获两者并只使用 student_group
对象:
student_group, created = Group.objects.get_or_create(name='STUDENT')
# ^^^ Add this
student.user.groups.add(student_group)
我有一个注册表单,我想在其中注册一个学生并实例化一个学生模型并将它们添加到该模型中。我有一个 CustomUser 模型,它被 Student 模型引用。
自定义用户模型
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 并直接从中调用用户。我希望用户位于具有指向 CustomUser 的外键的 Student 模型中,而不是从 CustomUser 调用用户,然后我可以使用 Student 实例执行我的业务逻辑。
get_or_create
实际上是 returns 一个元组,它由对象和一个表示对象是否已创建的标志组成,所以你需要捕获两者并只使用 student_group
对象:
student_group, created = Group.objects.get_or_create(name='STUDENT')
# ^^^ Add this
student.user.groups.add(student_group)