通过Django shell更新外键项
以下是models.py的内容:
class UserProfile(models.Model):
user = models.OneToOneField(User)
belongs_to_user_category = models.ForeignKey(UserCustomCategory, null=True, blank=True)
class UserHistory(models.Model):
date_time = models.DateTimeField()
user = models.ForeignKey(UserProfile, null=True, blank=True)
points_earned = models.DecimalField(max_digits=5, decimal_places=3)
很明显,userhistory是指向UserProfile的外键。为了测试,我想更新名字以a
开头的用户的积分。
我在Python命令行中写了以下代码:
from myapp.models import *
uobj = UserProfile.objects.all()
for i in uobj:
if i.user.username[0] == 'a':
b = UserHistory.objects.create(user=i)
b.points_earned = random.random(10, 100)
b.date_time = datetime.datetime.now()
b.save()
我也尝试过b = UserHistory.objects.get_or_create(user=i)
,但出现了同样的错误,结果我得到了以下错误信息:
ERROR: An unexpected error occurred while tokenizing input
The following traceback may be corrupted or invalid
The error message is: ('EOF in multi-line statement', (160, 0))
ERROR: An unexpected error occurred while tokenizing input
The following traceback may be corrupted or invalid
The error message is: ('EOF in multi-line statement', (13, 0))
ERROR: An unexpected error occurred while tokenizing input
The following traceback may be corrupted or invalid
The error message is: ('EOF in multi-line statement', (63, 0))
ERROR: Internal Python error in the inspect module.
Below is the traceback from this internal error.
Traceback (most recent call last):
File "/usr/local/lib/python2.6/dist-packages/IPython/ultraTB.py", line 667, in text
locals,formatvalue=var_repr))
File "/usr/lib/python2.6/inspect.py", line 875, in formatargvalues
specs.append(strseq(args[i], convert, join))
File "/usr/lib/python2.6/inspect.py", line 830, in strseq
return convert(object)
File "/usr/lib/python2.6/inspect.py", line 872, in convert
return formatarg(name) + formatvalue(locals[name])
KeyError: 'connection'
IPython's exception reporting continues...
---------------------------------------------------------------------------
IntegrityError Traceback (most recent call last)
IntegrityError: (1048, "Column 'date_time' cannot be null")
1 个回答
1
当你在Django中使用默认模型管理器的 create
方法时,它会尝试将这个实例创建并保存到数据库中。你可以用两种方式来做到这一点,不过我会先告诉你一种方法,这可能会帮助你更好地理解。
首先,你想要创建一个 UserHistory
对象,但实际上并不保存它。你只需要用你想要的默认值来实例化这个模型类就可以了:
b = UserHistory(user=i)
之后,你可以设置其他的属性。
b.points_earned = random.randint(10, 100)
b.date_time = datetime.datetime.now()
b.save()
这样是可以的。因为你现在是在设置了 date_time
之后再保存 b
。
当然,这里还有改进的空间,你可以把所有的操作放在一次调用中,因为你是在一个逻辑步骤中完成的,像这样:
b = UserHistory.objects.create(
user=i,
points_earned=random.randint(10, 100),
date_time=datetime.datetime.now(),
)
你还可以通过查看Django的 DateField 文档来进一步改进,这里会给你一些关于如何将默认日期设置为当前时间的建议。
希望这对你有帮助!