【问题标题】:Field 'id' expected a number but got 'User'字段“id”需要一个数字但得到“用户”
【发布时间】:2021-01-22 18:32:16
【问题描述】:

我正在尝试通过 POST 获取用户名并过滤掉用户并将其保存到模型中。每当我尝试迁移时,都会收到错误消息“字段 'id' 需要一个数字,但得到了 '用户'”

def newrequest(requests):
if (requests.user.is_authenticated and requests.user.userrank.userstatus == 'Agent'):
    if requests.method == 'POST':
        principalamount = requests.POST['principalamount']
        interest = requests.POST['interest']
        emi = requests.POST['emi']
        tenure = requests.POST['tenure'] 
        applicantsalary = requests.POST['applicantsalary']
        applicantname = requests.POST['applicantname']
        applicantcity = requests.POST['applicantcity']
        bankname = requests.POST['bankname']
        accountnumber = requests.POST['accountnumber']
        age = requests.POST['age']
        email = requests.POST['email']

        user = User.objects.get(email__email=email)

        loan = Loan(
            user = user,
            principalamount = principalamount,
            interest = interest,
            emi = emi,
            tenure = tenure,
            applicantsalary = applicantsalary,
            applicantname = applicantname,
            applicantcity = applicantcity,
            bankname = bankname,
            accountnumber = accountnumber,
            age = age,
        )
        loan.save()
    return JsonResponse({"message": "Loan Requested"})
else:
    return HttpResponseForbidden()

这是我的模特:

class Loan(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    loanid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
    principalamount = models.IntegerField()
    interest = models.IntegerField()
    emi = models.IntegerField()
    tenure = models.IntegerField() 
    applicantsalary = models.IntegerField()
    applicantname = models.CharField(max_length=300)
    applicantcity = models.CharField(max_length=25)
    bankname = models.CharField(max_length=100)
    accountnumber = models.CharField(max_length=25)
    age = models.IntegerField(null=True)

这是上面相关模型文件中的 Traceback 错误:

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, loansystem, sessions
Running migrations:
  Applying loansystem.0007_loan_user...Traceback (most recent call last):
  File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\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: 'Ankur'

Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    main()
  File "manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\django\core\management\__init__.py", line 401, in execute_from_command_line
    utility.execute()
  File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\django\core\management\__init__.py", line 395, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\django\core\management\base.py", line 330, in run_from_argv
    self.execute(*args, **cmd_options)
  File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\django\core\management\base.py", line 371, in execute
    output = self.handle(*args, **options)
  File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\django\core\management\base.py", line 85, in wrapped
    res = handle_func(*args, **kwargs)
  File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\django\core\management\commands\migrate.py", line 243, in handle
    post_migrate_state = executor.migrate(
  File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\django\db\migrations\executor.py", line 117, in migrate
    state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial)
  File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\django\db\migrations\executor.py", line 147, in _migrate_all_forwards
    state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
  File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\django\db\migrations\executor.py", line 227, in apply_migration
    state = migration.apply(state, schema_editor)
  File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\django\db\migrations\migration.py", line 124, in apply
    operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
  File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\django\db\migrations\operations\fields.py", line 104, in database_forwards
    schema_editor.add_field(
  File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\django\db\backends\sqlite3\schema.py", line 328, in add_field
    self._remake_table(model, create_field=field)
  File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\django\db\backends\sqlite3\schema.py", line 189, in _remake_table
    self.effective_default(create_field)
  File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\django\db\backends\base\schema.py", line 303, in effective_default
    return field.get_db_prep_save(self._effective_default(field), self.connection)
  File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\django\db\models\fields\related.py", line 971, in get_db_prep_save
    return self.target_field.get_db_prep_save(value, connection=connection)
  File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\django\db\models\fields\__init__.py", line 823, in get_db_prep_save
    return self.get_db_prep_value(value, connection=connection, prepared=False)
  File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\django\db\models\fields\__init__.py", line 2388, in get_db_prep_value
    value = self.get_prep_value(value)
  File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\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 'Ankur'.

这是迁移文件:

class Migration(migrations.Migration):

    dependencies = [
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
        ('loansystem', '0014_auto_20201007_2357'),
    ]

    operations = [
        migrations.AlterField(
            model_name='loan',
            name='user',
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
        ),
    ]

【问题讨论】:

  • userid = User.objects.filter(email__email=email).values('id')不是用户id,是用户id的QuerySet
  • 澄清一下,您在运行 python3 manage.py migrate 时是否收到此错误?或者当你参观的时候?
  • 当我尝试迁移时。错误来自我猜的观点。
  • @indianLeo:不,那是不可能的,迁移根本不关心视图。他们不看/解释/……意见。那么很明显模型存在问题。请发布完整回溯(edit问题)以及相关模型和迁移文件。
  • 我已经添加了回溯错误和相关的迁移文件

标签: django sqlite model


【解决方案1】:

您正在使用user 关键字,在本例中它引用了一个User 对象。不是传递用户对象,而是传递一个字典数组,如下所示:[{'id': 1}, ...]

要解决此问题,请删除 .values 子句:

user = User.objects.get(email__email=email)
loan = Loan(
    user=user,
    ...
)

请注意,当用户的email 字段不是唯一时,User.objets.get 将引发错误。

【讨论】:

    【解决方案2】:

    userid 不是用户的 id,它是一个 QuerySet 包装了用户 ID 的集合。这样做也没有多大意义,因为您可以立即检索用户:

    from django.contrib.auth.decorators import login_required
    
    @login_required
    def newrequest(requests):
        if requests.user.userrank.userstatus == 'Agent':
            if requests.method == 'POST':
                principalamount = requests.POST['principalamount']
                interest = requests.POST['interest']
                emi = requests.POST['emi']
                tenure = requests.POST['tenure'] 
                applicantsalary = requests.POST['applicantsalary']
                applicantname = requests.POST['applicantname']
                applicantcity = requests.POST['applicantcity']
                bankname = requests.POST['bankname']
                accountnumber = requests.POST['accountnumber']
                age = requests.POST['age']
                email = requests.POST['email']
                user = User.objects.get(email__email=email)
    
                loan = Loan(
                    user =user,
                    principalamount = principalamount,
                    interest = interest,
                    emi = emi,
                    tenure = tenure,
                    applicantsalary = applicantsalary,
                    applicantname = applicantname,
                    applicantcity = applicantcity,
                    bankname = bankname,
                    accountnumber = accountnumber,
                    age = age,
                )
                loan.save()
            return JsonResponse({"message": "Loan Requested"})
        else:
            return HttpResponseForbidden()

    话虽如此,您可能想使用ModelForm [Django-doc]。这使得验证和保存对象更加方便。


    注意:您可以使用 @login_required decorator [Django-doc].

    【讨论】:

    • 我尝试进行更改,但没有得到解决。我遇到了同样的错误
    • @IndianLeo:您是否删除了User.objects.get(id= userid) 部分并改用user?您可以通过编辑问题来分享完整的回溯吗?
    • 是的。我已经完成了所有提到的更改。
    • @indianLeo:但基于迁移时发生异常的事实,该错误在视图中不是。您应该在问题中包含完整回溯以及相关模型和迁移文件。
    • 我已经添加了raceback和migration文件。
    【解决方案3】:

    检查贷款模型中用户外键的默认值

    【讨论】:

      猜你喜欢
      • 2021-08-31
      • 1970-01-01
      • 1970-01-01
      • 2021-07-03
      • 2021-06-03
      • 2021-01-22
      • 2021-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多