2015-06-02 27 views
5

Próbuję ustawić pole typu JSONField używając factoryboy DjangoModelFactory. Oto kod:DjangoModelFactory JsonField zwracające dane Unicode zamiast danych słownikowych

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

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

    data = {"option_ids": [1]}  

w bazie odpowiedzi queryset, jestem coraz pole data jak Unicode a nie jako dict.

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

Czy brakuje mi czegoś?

+0

To może być związane z '' realizacji JSONField''; z którego używasz? – Xelnor

+0

Hi @ Xelnor, używam django-jsonfield - https://pypi.python.org/pypi/jsonfield – Shubham

Odpowiedz

0

Moje przypuszczenie (w oparciu o format otrzymanego wyniku) polega na wykonaniu kwerendy przy użyciu values(...).

Urządzenie QuerySet zwrócone podczas używania values zwraca obiekty jako instancje słownika (przy każdym kluczu odpowiadającym żądanej kolumnie modelu) zamiast wystąpień modelu (patrz doc). Wartości w słowniku odpowiadają temu, co jest przechowywane w bazie danych, nie ma konwersji obiektu złożonego z danych do danego pola, ponieważ nie ma instancji modelu.

Jeśli chcesz pobrać instancje modelu bezpośrednio, użyj zwykłego QuerySet, np. SubmittedAnswerFactory.objects.filter(...). A jeśli chcesz wybrać tylko niektóre pola podczas wykonywania faktycznego zapytania SQL do optymalizacji i nadal uzyskać instancję modelu, użyj only (lub defer) zamiast values (patrz doc).

Patrz:

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

kontra

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