【问题标题】:DjangoModelFactory JsonField returning Unicode data instead of dictionary dataDjangoModelFactory JsonField 返回 Unicode 数据而不是字典数据
【发布时间】:2015-08-15 23:02:22
【问题描述】:

我正在尝试使用 factoryboy DjangoModelFactory 设置类型为 JSONField 的字段。代码如下:

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]}'}]

我错过了什么吗?

【问题讨论】:

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


【解决方案1】:

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

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

如果您想直接获取模型实例,请使用常规 QuerySet,例如。 SubmittedAnswerFactory.objects.filter(...)。如果您想在执行实际 SQL 查询时仅选择某些字段进行优化,并且仍然获取模型实例,请使用 only(或 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
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-15
    • 2014-05-01
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多