字段“id”需要一个数字,但得到了 ObjectId
Posted
技术标签:
【中文标题】字段“id”需要一个数字,但得到了 ObjectId【英文标题】:Field 'id' expected a number but got ObjectId 【发布时间】:2021-07-03 03:55:52 【问题描述】:我正在研究 djongo,我正在尝试创建一个平台,自动为所有新注册用户分配随机数量(1 到 10 之间)比特币。
我的代码如下:
#views.py
def register_page(request):
if request.user.is_authenticated:
return redirect('order_list')
form = RegisterForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
messages.success(request,'Account successfully created, welcome '+ username)
newUserProfile(username) #<------ this is the function to generate the profile with random BTC
return redirect('login')
context = 'form':form
return render(request, 'api/register.html', context)
from djongo import models
from django.contrib.auth.models import User
#models.py
class UserProfile(models.Model):
id = models.BigAutoField(primary_key=True)
user = models.ForeignKey(User, on_delete=models.CASCADE)
BTC = models.FloatField()
balance = models.FloatField()
pending_balance = models.FloatField()
pending_BTC = models.FloatField()
#utils.py
def newUserProfile(username):
user = User.objects.get(username=username)
BTC = round(random.uniform(1,10),2)
profile = UserProfile.objects.create(user=user, BTC=BTC, balance = 0, pending_balance = 0, pending_BTC = 0)
profile.save()
当我按下网页上的注册按钮时,我得到:
Exception Type: TypeError
Exception Value:
Field 'id' expected a number but got ObjectId('606d892cb5d1f464cb7d2050').
但是当我进入数据库时,会定期记录新的配置文件:
# userprofile tab
"_id":"$oid":"606d892cb5d1f464cb7d2050",
"user_id":49,
"BTC":3.26,
"balance":0,
"pending_balance":0,
"pending_BTC":0
# auth_user tab
"_id":"$oid":"606d892cb5d1f464cb7d204f",
"id":49,
"password":"pbkdf2_sha256$180000$nNwVYtrtPYj0$/wwjhAJk7zUVSj8dFg+tbTE1C1Hnme+zfUbmtH6V/PE=",
"last_login":null,
"is_superuser":false,
"username":"Aokami",
"first_name":"",
"last_name":"",
"email":"Aokami@gmail.com",
"is_staff":false,
"is_active":true,
"date_joined":"$date":"2021-04-07T10:27:56.590Z"
如何解决这个问题,或者至少避免出现错误页面,因为我得到了我需要的东西?
【问题讨论】:
看起来您使用的是 Django 模型,而不是 Djongo 模型。 我编辑以包含我在 models.py 中导入的内容 【参考方案1】:_id
字段由 django 自动添加到对象中。您添加了另一个名为 id
的字段,它的类型为 number。因此,您不能将 django 的 _id
的值分配给您的 id
字段,因为它的类型不同。了解如何自定义 django 的 id 字段以避免这种重复 -> Automatic primary key fields。
您可以使用 django 的文档 id = models.BigAutoField(primary_key=True)
中的这一行
【讨论】:
嗨,汤姆!谢谢你的回答,我刚刚应用了这个,它在 db 中比以前效果更好,但它仍然在网页上给我同样的错误 如果您想将id
指定为主键,请在其中一个字段上使用 primary_key=True。如果 Django 看到你明确设置了 Field. primary_key,它不会添加自动 id 列。每个模型只需要一个字段来具有 primary_key=True(显式声明或自动添加)。
网页上的同样问题,我也用这个新行和新数据库的输出编辑了第一篇文章:)
id = models.BigAutoField(primary_key=True)
应该在 User 模型而不是 UserProfile 模型中..以上是关于字段“id”需要一个数字,但得到了 ObjectId的主要内容,如果未能解决你的问题,请参考以下文章
获取 ValueEerror:字段 'id' 需要一个数字,但得到一个 html
类型错误:字段 'id' 需要一个数字,但得到 (<Group: customer>, True) DJANGO ERROR
类型错误:字段 'id' 需要一个数字,但得到 <django.contrib.auth.models.AnonymousUser object at 0x048C7E90>