【问题标题】:automatically update model field each time每次自动更新模型字段
【发布时间】:2017-04-03 17:04:04
【问题描述】:

在我的名为 XBlockState 的模型中,我有多个字段,其中有 scenarioscenarioID 像这样定义

scenario = models.CharField(
    max_length=255,
    blank=True,
    null=True,
    db_index=True,
)
scenarioID = models.CharField(
    max_length=255,
    blank=True,
    null=True,
    db_index=True,

)

我需要为scenarioID设置一个值,格式如下

场景.0

【问题讨论】:

  • 您能否进一步详细说明scenario.O 格式?
  • 好吧抱歉,如果不清楚,如果scenario = "FirstScenario"然后scenarioID = "FirstScenario.0"

标签: django django-models


【解决方案1】:

它可能不是最干净的,但它应该可以解决问题:

你可以添加一个scenarioID字段

scenarioID = models.CharField(max_length=255, blank=True)

并覆盖 save 方法以在每次保存元素时强制更新它。然后您可以访问它并将其用于过滤,并在序列化对象中使用。

## in models.py ##

class XBlockState(models.Model):
## other fields
...
#scenarioField

scenario = models.CharField(
    max_length=255,
    blank=True,
    null=True,
    db_index=True,
)

def scenarioID_calc_field(self):
    return self.scenario+"."+str(self.pk)

def save(self, force_insert=False, force_update=False, using=None):
    self.scenarioID = self.scenarioID_calc_field() #as defined higher
    super(XBlockState, self).save()

【讨论】:

  • 是的,这正是我所需要的,它现在工作得很好,谢谢
  • 也许出于研究目的,您可以重写您的问题;更清楚地表明计算字段不是您想要的 - 并且具有更清晰的标题!可以帮助别人!
【解决方案2】:

我不确定我是否理解正确:

1/ 你的意思是 scenarioID 是一个自己的字段,在这种情况下:

views.py

new_scenario = XBlockState.objects.create(
    scenario = "Django Unchained",
    scenarioID = "0"
    )
new_scenario.save()

2/ 或者您希望scenarioID 是主键中的计算字段,在这种情况下,您需要查看如下内容:

models.py

class XBlockState(models.Model):
    ## other fields
    ...
    #scenarioField

    scenario = models.CharField(
        max_length=255,
        blank=True,
        null=True,
        db_index=True,
    )

    def scenarioID(self):
        return self.scenario+"."+str(self.pk)

你可以在任何地方使用类似的东西访问该字段

xblockstate_instance.scenarioID()

【讨论】:

  • scenarioID 应该是scenario+string。即如果scenario = "FirstScenario" 然后scenarioID = "FirstScenario.0"
  • 在这种情况下,我写得更高的计算字段应该可以工作。 (选项 2/)
  • 没有无需创建函数的解决方案,因为我正在序列化这些字段并使用 django rest 框架返回它们,而当我尝试您的解决方案时,场景 id 字段不会返回跨度>
猜你喜欢
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
  • 2012-12-30
  • 2016-06-12
  • 1970-01-01
相关资源
最近更新 更多