ValueError:字段“id”需要一个数字,但得到“正在处理”

问题描述 投票:0回答:16

我将在 DigitalOcean 上部署我的 django 应用程序。一切都很顺利,除了以下错误,我的问题是:我在哪里可以找到这个错误的来源,实际上在哪个文件中?

Operations to perform:
  Apply all migrations: admin, auth, ccapp, contenttypes, sessions
Running migrations:
  Applying ccapp.0009_auto_20191207_2148...Traceback (most recent call last):
  File "/home/progbash/ccproject/env/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 1768, in get_prep_value
    return int(value)

ValueError: invalid literal for int() with base 10: 'Processing'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "manage.py", line 21, in <module>
    main()
  File "manage.py", line 17, in main
    execute_from_command_line(sys.argv)
  File "/home/progbash/ccproject/env/lib/python3.6/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
    utility.execute()
  File "/home/progbash/ccproject/env/lib/python3.6/site-packages/django/core/management/__init__.py", line 395, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
...
  File "/home/progbash/ccproject/env/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 2361, in get_db_prep_value
    value = self.get_prep_value(value)
  File "/home/progbash/ccproject/env/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 1772, in get_prep_value
    ) from e
ValueError: Field 'id' expected a number but got 'Processing'.

models.py

from django.db import models
from datetime import datetime

class Question(models.Model):
    question_text = models.TextField(max_length=200)
    answer = models.TextField(max_length=200)

    def __str__(self):
        return self.question_text

class ApplicantStatus(models.Model):
    class Meta:
        verbose_name_plural = "Applicant Statuses"
        
    name = models.CharField(max_length=30)
    
    def __str__(self):
        return self.name

class Applicant(models.Model):
    name = models.CharField(max_length=20)
    surname = models.CharField(max_length=30)
    birth_date = models.DateField(blank=False)
    phone = models.CharField(max_length=15)
    email = models.EmailField(max_length=40)
    motivation_letter = models.TextField(max_length=200)
    status = models.ForeignKey(ApplicantStatus, on_delete=models.CASCADE, default=3)
    photo = models.FileField(upload_to='static/applicant_photos', blank=True)

    def __str__(self):
        return self.name

class Message(models.Model):
    message_text = models.CharField(max_length=200)
    sender_name = models.CharField(max_length=30)
    sender_email = models.EmailField(max_length=50)

    def __str__(self):
        return self.sender_name
python django
16个回答
15
投票

只是分享解决我收到的类似错误的解决方案: 就我而言,收到了同样的错误,因为我直接使用字段值创建模型实例,而没有指定字段名称,因此 ID 始终将第一个作为默认值 (ID=field1)。 通过将属性名称也添加到即时创建中解决了问题。

曾经:

model_instant = YourModel(field1, field2,...etc)

解决者:

model_instant = YourModel(field1 = field1, field2 = field2,...etc)

执行此操作,然后按照上面建议的操作:1)删除 dB 文件,2)删除迁移,然后 3)执行 makemigrations your_app_name,然后 4)迁移,然后 5)运行服务器,您应该可以开始了。


10
投票

只需删除除 init python 文件之外的所有迁移文件,运行 python manage.py makemigrations,然后运行 python manage.py migrate


9
投票

问题出在迁移文件中。我刚刚打开并将默认值从字符串类型更改为整数。


7
投票

从迁移文件中,我们可以找到以(001_initial.py,002_auto.py,003_,004_)开头的文件。在这些文件中,将默认值空字符串 (default= '') 或 django.utils.timezone.now() 替换为整数,例如 (default=1)。或许可以解决问题。enter image description here


2
投票

我遇到了类似的错误,终于找到了原因。只是在这里分享以防有人犯类似的错误。

我在我的模型上定义了一个自定义的

__init__
方法,并且在将 kwargs 传递给
*
时错误地只写了一个
super
:

def __init__(self, *args, **kwargs):
    super().init(*args, *kwargs)

这导致了错误消息:

ValueError: Field 'id' expected a number but got 'account'.

account
是我在视图中创建新实例时传递的第一个关键字参数。 事后看来,错误消息是有道理的,但我花了一个小时的混乱调试时间才注意到我的拼写错误。


1
投票

当我从未将

created
添加到
get_or_create

时,我收到此错误
someVariable = "someVariable"

# This will give the error "ValueError: Field 'id' expected a number but got someVariable"

my_model = myModel.objects.get_or_create(someField=someVariable)

添加此内容后已解决

# added created my_model, created = myModel.objects.get_or_create(someField=someVariable)
看到这个

https://docs.djangoproject.com/en/4.0/ref/models/querysets/#get-or-create


0
投票
我对像 TemplateView 或 ListView 这样不需要强制参数的简单 CBV 也有同样的问题。我很确定问题来自于 url 解释。对于像这样的简单 ListView

class ProfileList(generic.ListView): model = get_user_model()

网址

path('profile_list/dummy', ProfileList.as_view(), name='profile_lv'),

 有效,而下面的则不行,会抛出错误: 
Field 'id' Expected a number but getting 'profile_lv'

被抛出。其中 profile_lv 是 url 的名称... path('profile_list', ProfileList.as_view(), name='profile_lv'),

在路径后面添加任何带有斜杠(/)的内容都可以吗?!...


0
投票
python3 manage.py makemigrations <app_name>

,然后

python3 manage.py migrate
,然后运行服务器。
2)刚刚打开并将默认值从字符串类型更改为整数。

我认为选择第一个选项,因为它是安全的方法。

谢谢


0
投票
python manage.py makemigrations

python manage.py migrate。我认为您的问题将会解决。请立即尝试。


0
投票

`python manage.py makemigrations` `python manage.py migrate` `python manage.py runserver`



0
投票


0
投票

v1/unit/

清理迁移文件对我没有帮助。幸运的是,它在使用附加字符串扩展 URL 后才开始工作:

v1/unit/addProduct/



0
投票

  1. Clean up your dbase by deleting entries

    与您的型号不符,

    or putting in values for missing/wrong entries
    
    

  2. 确保模型中的值为
  3. blank=False, null=False

    defaults given
    ,然后重新运行迁移
    
    

  4. 放置一个条件,例如
  5. Table.field != "":

    或任何导致序列化器出现问题的值

    
    


0
投票

类型错误:字段“id”需要一个数字,但得到了

因为
get_country()

返回一个对象到

default
而不是id,如下所示:
# "models.py"

class Country(models.Model):
    name = models.CharField(max_length=20)

    def __str__(self):
        return self.name

    @classmethod
    def get_country(cls): # ↓ ↓ ↓ An object is returned ↓ ↓ ↓
        return Country.objects.get_or_create(id=1, name="USA")[0]

class Shipping(models.Model):
    country = models.ForeignKey(
        Country, # ↓ An object is returned
        default=Country.get_country,
        on_delete=models.CASCADE
    )
    fee = models.DecimalField(max_digits=5, decimal_places=2)

    def __str__(self):
        return str(self.country)

所以,我从
id

返回了

get_country()
,如下所示,然后错误就解决了:
# "models.py"

class Country(models.Model):
    name = models.CharField(max_length=20)

    def __str__(self):
        return self.name

    @classmethod
    def get_country(cls):                                       # ↓ Here
        return Country.objects.get_or_create(id=1, name="USA")[0].id

要小心,即使将
self.name

更改为

str(self.id)
,如下所示:
# "models.py"

class Country(models.Model):
    name = models.CharField(max_length=20)

    def __str__(self):
        return str(self.id) # Here

    @classmethod
    def get_country(cls):
        return Country.objects.get_or_create(id=1, name="USA")[0]

# ...

或者,即使删除
__str__()

,如下所示:

# "models.py"

class Country(models.Model):
    name = models.CharField(max_length=20)

    # def __str__(self):
    #     return str(self.id)

    @classmethod
    def get_country(cls):
        return Country.objects.get_or_create(id=1, name="USA")[0]

# ...

然后,错误没有解决。


0
投票

platform = models.ForeignKey(StreamPlatform, on_delete=models.CASCADE, related_name='studentlist',default=None, null=True, blank=True)

将默认值设置为无,因为整数值是自动生成和增量的。


-3
投票
db

migrations
pycache
文件解决了这个问题,然后再次运行
migrations
migrate
    

© www.soinside.com 2019 - 2024. All rights reserved.