gpt4 book ai didi

python - Django:调用 user.objects.get() 时为 "Too many values to unpack"

转载 作者:太空狗 更新时间:2023-10-29 17:37:14 26 4
gpt4 key购买 nike

在 Django 1.6 中,我定义了一个自定义用户模型,但出于某种原因,现在当我创建一个 super 用户并尝试获取它或以该 super 用户身份访问 Django 管理员时,我得到了这个 ValueError: Too many要解压的值。我仔细阅读了关于此错误的许多类似问题,但没有找到适合我的特定问题的任何内容。我不知道会出什么问题。

在自定义管理器中的自定义 create_usercreate_superuser 方法中,我确实传递了一个额外的字段,但该字段实际上并没有进入模型,所以我看不出为什么会导致问题。

此外,当尝试访问管理员时,我得到一个稍微不同的错误:AttributeError: 'UserObject' has no attribute 'has_module_perms'

完整回溯:

Traceback (most recent call last):
File "<console>", line 1, in <module>
File "C:\Users\JJ\Coding\virtualenvs\TCR5venv\lib\site-packages\django\db\models\manager.py", line 151, in get
return self.get_queryset().get(*args, **kwargs)
File "C:\Users\JJ\Coding\virtualenvs\TCR5venv\lib\site-packages\django\db\models\query.py", line 298, in get
clone = self.filter(*args, **kwargs)
File "C:\Users\JJ\Coding\virtualenvs\TCR5venv\lib\site-packages\django\db\models\query.py", line 590, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File "C:\Users\JJ\Coding\virtualenvs\TCR5venv\lib\site-packages\django\db\models\query.py", line 608, in _filter_or_exclude
clone.query.add_q(Q(*args, **kwargs))
File "C:\Users\JJ\Coding\virtualenvs\TCR5venv\lib\site-packages\django\db\models\sql\query.py", line 1198, in add_q
clause = self._add_q(where_part, used_aliases)
File "C:\Users\JJ\Coding\virtualenvs\TCR5venv\lib\site-packages\django\db\models\sql\query.py", line 1232, in _add_q
current_negated=current_negated)
File "C:\Users\JJ\Coding\virtualenvs\TCR5venv\lib\site-packages\django\db\models\sql\query.py", line 1035, in build_filter
arg, value = filter_expr
ValueError: too many values to unpack

客户用户模型:

class UserObject(AbstractBaseUser):

email = models.EmailField(max_length=254, unique=True, db_index=True)

USERNAME_FIELD = 'email'
# REQUIRED_FIELDS = ['student_or_business',]

# Tells us whether the UserObject is a business or student
@property
def type(self):
if hasattr(self, 'Student'.lower()):
return 'S'
elif hasattr(self, 'BusinessHandler'.lower()):
return 'B'
else:
raise TypeError, "UserObject has neither Student nor BusinessHandler connected."

# Gets us the actual UserObject's accompanying object, whether Student or Business
@property
def get_profile_object(self):
if self.type == 'S':
return getattr(self, 'Student'.lower())
elif self.type == 'B':
return getattr(self, 'BusinessHandler'.lower()) # to take advantage of refactoring

@property
def is_student(self):
return self.type == 'S'

@property
def is_business(self):
return self.type == 'B'

def relevant_item(self, input_tuple):
'''
Takes in a tuple of options for return in form (Student, Business[, other]).
Returns the appropriate option depending
'''
if not 2 <= len(input_tuple) <= 3:
raise TypeError, "relevant_item() requires a tuple of 2 or 3."
else:
if self.type == 'S':
return input_tuple[0]
elif self.type == 'B':
return input_tuple[1]
else:
return input_tuple[2] if len(input_tuple) == 3 else None


signup_date = models.DateTimeField(auto_now_add=True)

# admin stuff
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
is_staff = models.BooleanField(default=False)

# Settings
verified = models.BooleanField(default=False)
accepted_TOS = models.DateField(default=datetime.datetime.today())
# Date so can find who need to update when change TOS

# Temporary hashes/strings
verification_id = models.CharField(unique=True, default=lambda: random_string(20), max_length=20)
reset_password_code = models.CharField(blank=True, default=lambda: random_string(20), max_length=20)

def get_new_reset_password_code(self):
self.reset_password_code = random_string(20)
self.save()
return self.reset_password_code

def new_verification_id(self):
self.verification_id = random_string(20)
try:
self.save()
except IntegrityError:
self.new_verification_id()

objects = UserObjectManager()

自定义用户管理器:

class UserObjectManager(BaseUserManager):

@staticmethod
def create_accompanying_model(user, student_or_business):
'''
This creates the appropriate accompanying Student or BusinessHandler model when a
new UserObject is created.
'''

if student_or_business == 'S':
s = models.get_model('student', 'Student')
new_item = s.objects.create(user_object=user, UserObject_creation=True)
new_item.save()

elif student_or_business == 'B':
b = models.get_model('business', 'BusinessHandler')
new_item = b.objects.create(user_object=user, UserObject_creation=True)
new_item.save()

else:
msg = 'Must be Student or BusinessHandler.'
raise ValueError(msg)

def create_user(self, email, password, student_or_business):

# normalize student_or_business
if student_or_business.lower() in ('s', 'student'):
student_or_business = 'S'
elif student_or_business.lower() in ('b', 'business', 'BusinessHandler'.lower()):
student_or_business = 'B'

# Check if an email was provided
if not email:
msg = 'Users must have an email address.'
raise ValueError(msg)

# If a student, check if a '.edu' email address was provided
if email and student_or_business == 'S':
if not email.endswith('.edu'):
msg = 'Students must sign up with a .edu email address.'
raise ValueError(msg)

user = self.model(
email=UserObjectManager.normalize_email(email),

# Removed the below because calculating that differently
# student_or_business = student_or_business,

)

user.set_password(password)
user.save(using=self._db)

self.create_accompanying_model(user, student_or_business)

return user

def create_superuser(self, email, password, student_or_business):
user = self.create_user(email, password, student_or_business)
user.is_admin = True
user.is_staff = True
user.is_superuser = True
user.save(using=self._db)
return user

谢谢!

最佳答案

事实证明,这里的问题实际上与抛出的错误无关。

我意识到我实际上是在打电话

UserObject.objects.get('user@email.com')

代替

UserObject.objects.get(email='user@email.com')

这就是抛出错误的原因。如果查看 Django 源代码,您会发现在为 QuerySet 构建过滤器时,Django 会解压字段名称和数据以供过滤器使用,但由于我没有提供字段名称到objects.get(...),解包时出现错误。

为此使用了 Werkzeug 实时浏览器调试器;我强烈推荐它。

关于python - Django:调用 user.objects.get() 时为 "Too many values to unpack",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20820830/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com