5

我正在尝试JSONField使用 factoryboy设置类型字段DjangoModelFactory。这是代码:

class SubmittedAnswer(models.Model):
    data = JSONField(default={})
    is_rule_check_passed = models.NullBooleanField()

class SubmittedAnswerFactory(DjangoModelFactory):
    class Meta:
        model = SubmittedAnswer

    data = {"option_ids": [1]}    

在数据库查询集响应中,我将data字段作为Unicode而不是作为dict.

'data': u'{"option_ids":[3]}'}]

我错过了什么吗?

4

1 回答 1

0

我的猜测(基于您提供的输出格式)是您使用values(...).

QuerySet使用时返回的values返回项作为字典实例(每个键对应于模型的请求列)而不是模型实例(请参阅doc)。字典中的值对应于存储在数据库中的值,没有从数据到给定字段的复杂对象转换,因为没有模型的实例化。

如果您想直接获取模型实例,请使用常规QuerySet,例如。 SubmittedAnswerFactory.objects.filter(...). 如果您想在执行实际 SQL 查询时仅选择一些字段进行优化,并且仍然获取模型实例,请使用only(or defer) 而不是values(参见doc )。

看:

for a in SubmittedAnswer.objects.only('option_ids'):
    print a.option_ids
>>> {'option_ids': [3]} # Dictionary object obtained by deserializing the data stored in the databse
...

相对

for a in SubmittedAnswer.objects.values('option_ids'):
  print a['option_ids']
>>> u'{"option_ids": [3]}' # unicode string as stored in database
...
于 2016-11-14T12:32:12.213 回答