【问题标题】:Django - "last_modified" or "auto_now_add" for an App (or more than one Model?)Django - 一个应用程序的“last_modified”或“auto_now_add”(或多个模型?)
【发布时间】:2011-10-02 04:35:01
【问题描述】:

我知道 Django 具有 last_modified 字段的功能 (models.DateTimeField(auto_now_add=True) )..

但是假设我有一个应用程序,我想知道它的任何模型的最后一次更改是什么时候(我真的不在乎哪个模型被更改了,我只想知道最新的更改是什么时候这个应用程序..)

我真的必须为每个模型编写一个 last_modified 字段(我目前有 9 个......),然后检查每个模型哪个是最新的?

任何帮助将不胜感激:) 谢谢

【问题讨论】:

    标签: django django-models last-modified


    【解决方案1】:

    最后我为我的应用程序制作了一个常量表(实际上我之前有它用于其他用途)。 所以表格看起来像这样:

    from django.db import models
    from django.db.models.signals import post_save
    
    class Constant(models.Model):
        name = models.CharField(max_length=50)
        value = models.CharField(max_length=50)
    

    并添加了一个名为“version_date”的常量。

    然后,我将此代码添加到我的 models.py 的底部,以跟踪应用程序中所有模型的所有更改。

    myapp = models.get_app('myapp')
    models2track = models.get_models(myapp)
    def update_version(sender, **kwargs):
        for model in models2track:
            post_save.disconnect(update_version, sender=model, dispatch_uid="some_uid"+model._meta.db_table)
    
        version_date = Constant.objects.get_or_create(id=1,name="version date")[0]
        version_date.value = str(int(time.time()))
        version_date.save()
    
        for model in models2track:
            post_save.connect(update_version, sender=model, dispatch_uid="some_uid"+model._meta.db_table)
    
    for model in models2track:
        post_save.connect(update_version, sender=model, dispatch_uid="some_uid"+model._meta.db_table)
    

    这样,我不需要更改我的 DB Schema.. 只需要添加提到的代码。 谢谢大家

    【讨论】:

      【解决方案2】:

      您可以创建一个定义 last_modified 字段的基类...

      class YourBaseClassName(models.Model):
          last_modified = models.DateTimeField(auto_now=True)
      

      然后从那个继承

      class AnotherClass(YourBaseClassName):
          another_field = models.CharField(max_length=50)
      

      【讨论】:

      • 我认为 nivniv 的主要问题是他不想单独检查每个模型......在这种情况下,为所有模型都有一个非抽象基类会更有意义,然后你可以和YourBaseClassName.objects.all().order_by('-last_modified')[0] 核对最后的日期...
      • 我可以看到。我改变了我的答案,使基类不是抽象的。
      • 谢谢你们!好吧,它仍然让我们对每个模型做一些事情,不是吗? :/ 你知道这个解决方案与为每个模型捕获一个 post_save 信号并在另一个“通用数据”模型中更新一些参数有什么不同吗? (这使我不必更改当前模型的数据库)
      猜你喜欢
      • 2012-11-02
      • 1970-01-01
      • 2015-02-08
      • 2011-12-22
      • 2016-09-17
      • 1970-01-01
      • 1970-01-01
      • 2013-02-13
      • 1970-01-01
      相关资源
      最近更新 更多