DjangoModelFactory JsonField返回Unicode数据而不是字典数据

时间:2015-06-02 08:41:24

标签: django django-testing factory-boy django-jsonfield

我正在尝试使用factoryboy JSONField设置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]}'}]

我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

我的猜测(根据您提供的输出格式)是您使用values(...)执行查询。

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

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

请参阅:

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
...