python - 在 Django 中自动返回“无”的 ID 字段
问题描述
我是 Django 的初学者,试图创建一个程序来保存带有一些输入的模型。
(最终,我将使用一个表单作为该输入,但它request.POST
会包含我想发送到多个不同地方的东西,所以我不能只使用一个ModelForm
。)
这是模型的代码:
class Bid(models.Model):
bid_owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name="owner")
bid_value = models.DecimalField(max_digits=6, decimal_places=2)
bid_no = models.IntegerField(default=0, null = True, blank=True)
bid_open = models.BooleanField(default=True, null = True, blank=True)
bid_winner = models.ForeignKey(User, blank=True, default="None", null=True, on_delete=models.CASCADE, related_name="winner")
def __str__(self):
return f"My ID is {self.id} and this is {self.bid_owner}'s listing"
这是我在views.py中调用的代码:
def bar(request):
foo = Bid(bid_owner = request.user, bid_value = 25)
foo.save()
但它不断提出错误:
字段“id”需要一个数字,但得到“无”。
从文档中,我看到该id
字段的内容应该在保存过程中自动生成,所以我不知道如何解决这个问题。在渲染HttpResponse
显示中,foo
除了id
. 我也可以Bid
使用管理员创建一个新的就好了。
这是完整的追溯:
Environment:
Request Method: GET
Request URL: http://127.0.0.1:8000/createpage
Django Version: 3.2.7
Python Version: 3.9.7
Installed Applications:
['auctions',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback (most recent call last):
File "C:\Users\Casual Hermit\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\fields\__init__.py", line 1823, in get_prep_value
return int(value)
The above exception (invalid literal for int() with base 10: 'None') was the direct cause of the following exception:
File "C:\Users\Casual Hermit\AppData\Local\Programs\Python\Python39\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "C:\Users\Casual Hermit\AppData\Local\Programs\Python\Python39\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\Casual Hermit\Documents\cs50_webdev\projects\project2\commerce\commerce\auctions\views.py", line 121, in creation_page
foo.save()
File "C:\Users\Casual Hermit\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\base.py", line 726, in save
self.save_base(using=using, force_insert=force_insert,
File "C:\Users\Casual Hermit\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\base.py", line 763, in save_base
updated = self._save_table(
File "C:\Users\Casual Hermit\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\base.py", line 868, in _save_table
results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
File "C:\Users\Casual Hermit\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\base.py", line 906, in _do_insert
return manager._insert(
File "C:\Users\Casual Hermit\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "C:\Users\Casual Hermit\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\query.py", line 1270, in _insert
return query.get_compiler(using=using).execute_sql(returning_fields)
File "C:\Users\Casual Hermit\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\sql\compiler.py", line 1415, in execute_sql
for sql, params in self.as_sql():
File "C:\Users\Casual Hermit\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\sql\compiler.py", line 1358, in as_sql
value_rows = [
File "C:\Users\Casual Hermit\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\sql\compiler.py", line 1359, in <listcomp>
[self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
File "C:\Users\Casual Hermit\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\sql\compiler.py", line 1359, in <listcomp>
[self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
File "C:\Users\Casual Hermit\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\sql\compiler.py", line 1300, in prepare_value
value = field.get_db_prep_save(value, connection=self.connection)
File "C:\Users\Casual Hermit\AppData\Local\Programs\Python\Python39\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\Casual Hermit\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\fields\__init__.py", line 842, in get_db_prep_save
return self.get_db_prep_value(value, connection=connection, prepared=False)
File "C:\Users\Casual Hermit\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\fields\__init__.py", line 2486, in get_db_prep_value
value = self.get_prep_value(value)
File "C:\Users\Casual Hermit\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\fields\__init__.py", line 1825, in get_prep_value
raise e.__class__(
Exception Type: ValueError at /createpage
Exception Value: Field 'id' expected a number but got 'None'.
解决方案
问题在于领域的default
价值bid_winner
。
您正在尝试创建Bid
记录而不通过bid_winner
. 因此,当保存Bid
对象时,Django 尝试bid_winner
使用其默认值填充列,即"None"
.
但是 Django 期望在其中找到一个id
,因为bid_winner
is ForeignKey
。
所以省略默认值bid_winner
来解决这个问题。正如你所声明null=True
的那样,None
如果你不传递任何东西给它。
推荐阅读
- python-3.x - Azure-sdk-for-python AKS-如何在 AKS 上升级 kubernetes
- swift - AssetReader/AssetWriter - CMSampleBuffer 和 CALayer
- javascript - 从函数 node.js 访问变量数据
- regex - 正则表达式来分隔时间并用分隔符替换它
- c++ - 如果插入了正确的输入,则终止程序
- julia - 如何在 Windows 上的 Julia REPL 中清除屏幕
- python - 我可以在我的代码中添加什么以在输出中显示排序所做的所有动作?
- r - 从 VBA 运行 R 并查看后台发生的情况
- php - 更改 WooCommerce 购物车和结帐页面中的“运输”文本:[重复新]
- javascript - 蚂蚁设计风格