当前位置: 首页 > 面试题库 >

由Django中的字段更改触发的动作

松阳泽
2023-03-14
问题内容

在其中一个模型中更改字段时,我将如何采取行动?在这种情况下,我有以下模型:

class Game(models.Model):
    STATE_CHOICES = (
        ('S', 'Setup'),
        ('A', 'Active'),
        ('P', 'Paused'),
        ('F', 'Finished')
        )
    name = models.CharField(max_length=100)
    owner = models.ForeignKey(User)
    created = models.DateTimeField(auto_now_add=True)
    started = models.DateTimeField(null=True)
    state = models.CharField(max_length=1, choices=STATE_CHOICES, default='S')

并且我想创建一个单位,并在状态从“设置”变为“活动”时,在“开始”字段中填充当前日期时间(除其他外)。

我怀疑需要一个模型实例方法,但是文档似乎对于以这种方式使用它们并没有太多话要说。

更新: 我在游戏类中添加了以下内容:

    def __init__(self, *args, **kwargs):
        super(Game, self).__init__(*args, **kwargs)
        self.old_state = self.state

    def save(self, force_insert=False, force_update=False):
        if self.old_state == 'S' and self.state == 'A':
            self.started = datetime.datetime.now()
        super(Game, self).save(force_insert, force_update)
        self.old_state = self.state

问题答案:

基本上,您需要重写该save方法,检查state字段是否已更改,started是否需要进行设置,然后让模型基类完成对数据库的持久化。

棘手的部分是确定字段是否已更改。请查看此问题中的mixin和其他解决方案,以帮助您解决此问题:

  • Django中的dirty字段


 类似资料:
  • 问题内容: 我想要有关一个字段值的其他字段。为此,我构建了一个自定义管理表单以添加一些新字段。 与jacobian 1的博客文章相关,这是我想出的: 但是其他字段“ foo”不会显示在管理员中。如果我像这样添加字段,则所有工作都很好,但没有按要求动态化,以添加有关模型的另一个字段的值的字段 那么,有没有我必须再次触发以使新字段起作用的初始化方法?还是有其他尝试? 问题答案: 这是解决问题的方法。感

  • 问题内容: 我正在尝试使用所有动态元素创建一个层叠下拉列表。 我的HTML: 我有2个使用ajax加载元素的函数,都可以正常工作: 我需要根据站点选择来调用GetSectors。我有这个: 但这是行不通的。我正在使用jQuery 1.8.3。 知道哪里出了问题吗? 谢谢! 问题答案: 尝试 事件委派 : 事件冒泡的行为使我们可以执行“事件委托” — 将处理程序绑定到高级元素,然后检测哪个低级元素启

  • 问题内容: 我想要一个触发器来对插入的记录执行以下操作: 更清楚的说:说我有一个包含三列的表:主键,整型,varchar。 当我这样插入时: 我想拥有: 但是当我省略时: 它应自动设置为此记录的: 扳机有可能吗?(我知道插入后可以更新记录,但使用触发器会更好。) 问题答案: 我不知道任何方法可以在一个语句中执行此操作,即使使用触发器也是如此。 @Lucky建议的触发器解决方案在MySQL中如下所示

  • 有没有一种方法可以动态地改变哪些字段可供Angular-QueryBuilder使用? 我试过: 正在更新我的的属性。 不会发生任何情况。 字段会更新。 但是,现在某些字段会中断查询生成器。当选择其中任何一个字段时,“添加规则”和“添加规则集”按钮显示为不执行任何操作。在添加内容显示之前,必须删除“问题”字段。 视频:https://i.imgur.com/uxzgpq4.mp4

  • 问题内容: 由于声誉的限制,这是对先前问题的回答的后续问题。 但是想象一下一个有变化的列的大桌子。您必须比较每列,如果数据库发生更改,则必须调整触发器。而且比较硬编码的每一行都没有“感觉”好:) 是的,但这就是进行的方式。 附带说明一下,在更新之前先检查一下也是一种好习惯: 在您的示例中,这将使其更新(从而覆盖)两行而不是三行。 我想知道在处理NULL值时是否有更有效的方法来测试每个字段的更改。

  • 问题内容: 我正在尝试像SQL中的别名一样更改DRF序列化器中的“模型”字段名称。我尝试了不同的方法,但无法成功。 models.py serializers.py 我也曾尝试在Django Queryset中添加别名,但无法更改。 更新 这是我面临的例外 / ViewName /’模块’对象上的AttributeError没有属性’Field’ 我怎样才能做到这一点? 问题答案: 序列化程序字段