【问题标题】:default django model filed with value from the immediatelly previous entry默认 django 模型字段,其值来自上一个条目
【发布时间】:2012-12-16 08:59:48
【问题描述】:

我有一个应该跟踪时间的应用程序,其中一个条目(称为 begin_sec)应该具有(或默认为)前一个条目的变量的值(称为 end_sec)(除非它是第一个条目只发生一次的特殊情况)。

这是我的模型

TimeLog(model.Model);
    begin_sec= models.DateTimeField( auto_now=False,
                                   auto_now_add=False,
                                   default=?
                                   help_text="YYYY-MM-DD HH-MM-SS")
    end_sec = models.DateTimeField( auto_now=False,
                                   auto_now_add=False,
                                   default=?
                                   help_text="YYYY-MM-DD HH-MM-SS")

    ... other parts of the model.          

所以当我添加这种类型的新条目时,我第一次以用户身份打开应用程序时,我可以将开始时间默认为 now(),我可以选择 end_sec,但在第二次及以后我希望 begin_sec 是/默认为最后一个条目的 end_sec。 我将如何实现?

【问题讨论】:

    标签: python django forms django-models field


    【解决方案1】:

    在这种情况下不要指定default 值。最好的方法是在模型形式 save 方法中:

    class TimeLogForm(forms.ModelForm):
        class Meta:
            exclude = ['begin_sec']
            model = TimeLog
    
        def __init__(self, *args, **kw):
            super(TimeLogForm).__init__(self, *args, **kw)
    
        def save(self, *args, **kw):
            instance = super(TimeLogForm, self).save(commit=False)
            last_entry = TimeLog.objects.all().order_by('-id')[0]
            if last_entry:
                instance.begin_sec = last_entry.begin_sec
            else:
                # this is the very first record do something
                pass
            instance.save()
            return instance
    

    另外,您不需要为这两个字段设置auto_now=Falseauto_now_add=False,默认情况下它们是False

    【讨论】:

    • 不应该 def __ intit __ 而不是 def __ init __ 吗?
    • @mike 是的,它应该是__init__。对不起一个错字。我现在已经修好了。
    • 我不知道这是否应该是一个单独的问题,假设我想按 request.user 过滤对象我会怎么做? TimeLog.objects.all().order_by('-id')[0]
    • @mike 使用这个TimeLog.objects.filter(user__id=user.id).order_by('-id')[0] 最好贴出实际模型,如果你不明白,我可以给你准确的查询以按用户过滤。
    • 我已经弄明白了,所以不用担心。
    猜你喜欢
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 2015-09-26
    • 2010-10-19
    • 2017-01-28
    • 1970-01-01
    • 2014-07-25
    相关资源
    最近更新 更多