Rog*_*ger 126 python django django-models
自动设置对象的创建日期的最佳方法是什么,以及将在上次更新对象时记录的字段?
在我的模型中,我有:
created_at = models.DateTimeField(False, True, editable=False)
updated_at = models.DateTimeField(True, True, editable=False)
Run Code Online (Sandbox Code Playgroud)
在我看来:
if request.method == 'POST':
form = MyForm(request.POST)
if form.is_valid():
obj = form.save(commit=False)
obj.user = request.user
obj.save()
return HttpResponseRedirect('obj_list')
Run Code Online (Sandbox Code Playgroud)
我收到错误:
objects_object.created_at may not be NULL
Run Code Online (Sandbox Code Playgroud)
我是否必须自己手动设置此值?我认为这是传递给DateTimeFields的参数点(或者它们只是默认值,因为我设置'editable = False'它们不会显示在表单上,因此不会在请求中提交,因此不要进入表格?).
这样做的最佳方法是什么?一个init方法?
谢谢
ps - 我是django和Python的新手......
Man*_*dan 268
您可以使用auto_now
和auto_now_add
选项updated_at
和created_at
分别.
class MyModel(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
Run Code Online (Sandbox Code Playgroud)
好吧,上面的答案是正确的,auto_now_add和auto_now可以做到,但是最好创建一个抽象类,并在需要的任何模型created_at
和updated_at
字段中使用它。
class TimeStampMixin(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
abstract = True
Run Code Online (Sandbox Code Playgroud)
现在,您可以在任何要使用它的地方进行简单的继承,并且可以在任何喜欢的模型中使用时间戳。
class Posts(TimeStampMixin):
name = models.CharField(max_length=50)
...
...
Run Code Online (Sandbox Code Playgroud)
这样,您可以在Django DRY中利用面向对象的可重用性(不要重复自己)