Django jsonfield在循环中持久化旧对象值

时间:2017-10-28 05:04:28

标签: python django

以下是模型:

class ModelA(models.Model):
    field1 = models.CharField(max_length=100)
    field2 = models.CharField(max_length=100)
    field3 = JSONField(default=[])

    def save(self, *args, **kwargs):
        # Below print should be None
        # But it shows the value of the previously created object, why ?
        print "------------------------------------------------"
        print self.id
        print "self.field3"
        print self.field3
        self.field2 = self.field1 + " world"
        self.field3.append(self.field2)
        super(ModelA, self).save(*args, **kwargs)

以下是观点:

def view1(request):
    for x in range(1, 3):
          a = ModelA.objects.create(field1="hello%s" % x)

预期产出:

# None
# self.field3
# []

# None
# self.field3
# []

达到产出:

# None
# self.field3
# []

# None
# self.field3
# [u'Hello1 world']

# None
# self.field3
# [u'Hello1 world', u'Hello2 world']

那么,根据给定的输出,你能告诉我为什么它在创建新对象时使用以前的对象值吗?

1 个答案:

答案 0 :(得分:2)

这是来自Django documentation

  

如果您为该字段指定默认值,请确保它是可调用的,例如dict   (对于空的默认值)或返回dict的可调用对象(例如   功能)。错误地使用default = {}会创建一个可变的默认值   在JSONField的所有实例之间共享。

因此请改用:

field3 = JSONField(default=list)