создавать фикстуры с помощью пользовательских методов диспетчера, дампов json и способов избежать ошибок типа: xxx не является сериализуемым json

Я пытаюсь создать тестовое приспособление, используя специальные методы менеджера, поскольку мое приложение использует подмножество таблиц dbtables и меньшее количество записей. поэтому я отказался от идеи использовать initial_data. В диспетчере делаю примерно так. в Managers.py:

sitedict = Site.objects.filter(pk=1234).values()[0]
custdict = Customer.objects.filter(custid=123456).values()[0]
customer = {"pk":123456,"model":"myapp.customer","fields":custdict}
site = {"pk":0001,"model":"myapp.site","fields":sitedict}
csvfile = open('shoppingcart/bsofttestdata.csv','wb')
csv_writer = csv.writer(csvfile) 
csv_writer.writerow([customer,site])

затем я изменил свой файл csv, чтобы заменить одинарные кавычки на двойные и т. д. Затем я сохранил этот файл как json. Извините, если это слишком глупо, но это первый раз, когда я создаю тестовые данные, я бы хотел узнать лучше Пример данных файла выглядит так: myapp / fixtures / testdata.json

[{"pk": 123456, "model": "myapp.customer", "fields": {"city": "abc", "maritalstatus": None, "zipcode": "12345", "lname": "fdfdf", "state": "AZ", "agentid": 1111, "fname": "sdadsad", "email": "[email protected]", "phone": "0000000000", "custid":123456,"datecreate": datetime.datetime(2011, 3, 29, 11, 40, 18, 157612)}},{"pk":0001, "model": "myapp.site", "fields": {"url": "http://google.com", "websitecode": "", "notify": True, "fee": 210.0, "id":0001}}]

Я использовал это для запуска своих тестов, но получил следующую ошибку:

EProblem installing fixture '/var/lib/django/myproject/myapp/fixtures/testdata.json':    
    Traceback (most recent call last):
      File "/usr/lib/pymodules/python2.6/django/core/management/commands/loaddata.py", line 150, in handle
        for obj in objects:
      File "/usr/lib/pymodules/python2.6/django/core/serializers/json.py", line 41, in Deserializer
        for obj in PythonDeserializer(simplejson.load(stream)):
      File "/usr/lib/pymodules/python2.6/simplejson/__init__.py", line 267, in load
        parse_constant=parse_constant, **kw)
      File "/usr/lib/pymodules/python2.6/simplejson/__init__.py", line 307, in loads
        return _default_decoder.decode(s)
      File "/usr/lib/pymodules/python2.6/simplejson/decoder.py", line 335, in decode
        obj, end = self.raw_decode(s, idx=_w(s, 0).end())
      File "/usr/lib/pymodules/python2.6/simplejson/decoder.py", line 353, in raw_decode
        raise ValueError("No JSON object could be decoded")
    ValueError: No JSON object could be decoded

person stackover    schedule 07.04.2011    source источник


Ответы (1)


вместо использования raw find замените его лучше использовать что-то , как показано здесь, и когда мы имеют некоторые типы данных, которые не поддерживаются JSON. было бы полезно получить избавиться от TypeError: xxxxxxx не является сериализуемым JSON или специально stackover post для проблемы Datetime будет полезно.

РЕДАКТИРОВАТЬ: вместо того, чтобы писать в csv, а затем изменять его вручную, я сделал следующее:

with open('myapp/fixtures/customer_testdata.json',mode = 'w') as f:
    json.dump(customer,f,indent=2)

вот небольшой код, который я использовал, чтобы выйти из TypeError: xxxx not json blah blah проблема

for key in cust.keys():
    value = cust[key]
    if isinstance(cust[key],datetime.datetime):
        temp = cust[key].timetuple() # this converts datetime.datetime to time.struct_time
        cust.update({key:{'__class__':'time.asctime','__value__':time.asctime(temp)}})
return cust

если мы преобразуем datetime.datetime в любой другой тип, то мы должны соответственно изменить класс. Например, timestamp -> float - это фантастический справочник по преобразованию даты и времени

Надеюсь, это будет полезно.

person stackover    schedule 07.04.2011