首页 > 解决方案 > ValueError:字段 'id' 需要一个数字,但得到了 'kumarsingha922@gmail.com'

问题描述

我做了一个 django 项目,在其中我做了一个测试,我将电子邮件分配给电子邮件,但它把它作为一个 Id 解决了这个问题。这是一个 django 项目,我在其中制作了一个收据 api。. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ... . . . . . . . . , , . . .

模型.py

    from django.db import models
    from django.contrib.auth.models import AbstractBaseUser,BaseUserManager,PermissionsMixin
    # Create your models here.
    
    class UserManager(BaseUserManager):
    
        def create_user(self,email, password, **extra_fields):
            user = self.model(email, **extra_fields)
            user.set_password(password)
            user.save(using= self._db)
    
            return user
    
    class User(AbstractBaseUser,PermissionsMixin):
    
        email = models.EmailField(max_length=255,unique=True)
        name = models.CharField(max_length=255)
        is_active = models.BooleanField(default=True)
        is_staff = models.BooleanField(default=False)
    
        objects = UserManager()
    
        USERNAME_FIELD = "email"

test_models.py

from django.test import TestCase
from django.contrib.auth import get_user_model

class ModelTests(TestCase):

    def test_create_user_with_email_sucessfully(self):

        email = "kumarsingha922@gmail.com"
        password = "Singh@922"

        user = get_user_model().objects.create_user(
            email=email,
            password=password
        )

        self.assertEqual(user.email,email)
        self.assertTrue(user.check_password(password))

错误

WARNING: Found orphan containers (recipe-api_db_1) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
    Creating recipe-api_app_run ... done
    Creating test database for alias 'default'...
    System check identified no issues (0 silenced).
    E
    ======================================================================
    ERROR: test_create_user_with_email_sucessfully (core.tests.test_models.ModelTests)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/usr/local/lib/python3.8/site-packages/django/db/models/fields/__init__.py", line 1774, in get_prep_value
        return int(value)
    ValueError: invalid literal for int() with base 10: 'kumarsingha922@gmail.com'
    
    The above exception was the direct cause of the following exception:
    
    Traceback (most recent call last):
      File "/app/core/tests/test_models.py", line 11, in test_create_user_with_email_sucessfully
        user = get_user_model().objects.create_user(
      File "/app/core/models.py", line 10, in create_user
        user.save(using= self._db)
      File "/usr/local/lib/python3.8/site-packages/django/contrib/auth/base_user.py", line 67, in save
        super().save(*args, **kwargs)
      File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 753, in save
        self.save_base(using=using, force_insert=force_insert,
      File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 790, in save_base
        updated = self._save_table(
      File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 872, in _save_table
        updated = self._do_update(base_qs, using, pk_val, values, update_fields,
      File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 906, in _do_update
        filtered = base_qs.filter(pk=pk_val)
      File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 942, in filter
        return self._filter_or_exclude(False, *args, **kwargs)
      File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 962, in _filter_or_exclude
        clone._filter_or_exclude_inplace(negate, *args, **kwargs)
      File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 969, in _filter_or_exclude_inplace
        self._query.add_q(Q(*args, **kwargs))
      File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1358, in add_q
        clause, _ = self._add_q(q_object, self.used_aliases)
      File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1377, in _add_q
        child_clause, needed_inner = self.build_filter(
      File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1319, in build_filter
        condition = self.build_lookup(lookups, col, value)
      File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1165, in build_lookup
        lookup = lookup_class(lhs, rhs)
      File "/usr/local/lib/python3.8/site-packages/django/db/models/lookups.py", line 24, in __init__
        self.rhs = self.get_prep_lookup()
      File "/usr/local/lib/python3.8/site-packages/django/db/models/lookups.py", line 76, in get_prep_lookup
        return self.lhs.output_field.get_prep_value(self.rhs)
      File "/usr/local/lib/python3.8/site-packages/django/db/models/fields/__init__.py", line 1776, in get_prep_value
        raise e.__class__(
    ValueError: Field 'id' expected a number but got 'kumarsingha922@gmail.com'.
    
    ----------------------------------------------------------------------
    Ran 1 test in 0.115s
    
    FAILED (errors=1)
    Destroying test database for alias 'default'...

标签: pythondjangodjango-rest-framework

解决方案


第一个参数__init__是 id 而不是电子邮件,请改用关键字参数

        user = self.model(email=email, **extra_fields)

推荐阅读