通过Django shell更新外键项

0 投票
1 回答
2192 浏览
提问于 2025-04-17 03:06

以下是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 文档来进一步改进,这里会给你一些关于如何将默认日期设置为当前时间的建议。

希望这对你有帮助!

撰写回答