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

Shu*_*ham 5 django django-testing factory-boy django-jsonfield

我正在尝试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]}    
Run Code Online (Sandbox Code Playgroud)

在数据库查询集响应中,我得到的data字段为as Unicode而不是as dict.

'data': u'{"option_ids":[3]}'}]
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

rpa*_*ent 0

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

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

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

看:

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
...
Run Code Online (Sandbox Code Playgroud)

相对

for a in SubmittedAnswer.objects.values('option_ids'):
  print a['option_ids']
>>> u'{"option_ids": [3]}' # unicode string as stored in database
...
Run Code Online (Sandbox Code Playgroud)