2015-05-11 3 views
1

Я определил Test модели как:ValidationError в Django модель

class Test(models.Model): 

    name = models.BinaryField(blank=False) 
    time = models.TimeField() 

    # one test case has many tests 
    testcase = models.ForeignKey(TestCase) 

    def __str__(self): 
     return self.name 

при попытке разобрать xml файл для создания модели объекта У меня есть следующий метод:

def add_test(testcase, obj): 
    kwargs = { 
     'name': "", 
     'time': None, 
    } 
    status = 1 
    # create the test object 
    for k, v in obj.iteritems(): 
     if k == '@name': 
      kwargs['name'] = v if v is not None else "" 
     elif k == '@time': 
      kwargs['time'] = v 
    print kwargs 
    test = Test(testcase=testcase, **kwargs) 
    test.save() 

Там, testcase является вариантом модели TestCase. kwargs имеют правильный вход:

{'name': u'runTest', 'time': u'36.332'} 

Однако, когда я призываю выше функции я получаю:

Traceback (most recent call last): 
    File "dbsync.py", line 131, in <module> 
    add_testsuite("scale") 
    File "dbsync.py", line 55, in add_testsuite 
    add_testcases(testsuite, testcases) 
    File "dbsync.py", line 87, in add_testcases 
    status = add_test(testcase_obj, testcase) 
    File "dbsync.py", line 103, in add_test 
    test.save() 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 710, in save 
    force_update=force_update, update_fields=update_fields) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 738, in save_base 
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 822, in _save_table 
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 861, in _do_insert 
    using=using, raw=raw) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py", line 127, in manager_method 
    return getattr(self.get_queryset(), name)(*args, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 920, in _insert 
    return query.get_compiler(using=using).execute_sql(return_id) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py", line 970, in execute_sql 
    for sql, params in self.as_sql(): 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py", line 928, in as_sql 
    for obj in self.query.objs 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/__init__.py", line 710, in get_db_prep_save 
    prepared=False) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/__init__.py", line 2293, in get_db_prep_value 
    value = self.get_prep_value(value) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/__init__.py", line 2288, in get_prep_value 
    return self.to_python(value) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/__init__.py", line 2275, in to_python 
    params={'value': value}, 
django.core.exceptions.ValidationError 

Я не совсем понимаю, что происходит там ... какие-либо улики?

+0

Не время? Должно быть экземпляром datetime.time? – Charlesthk

ответ

2

Для выполнения этой работы вам необходимо преобразовать строку в datetime.time.

kwargs['time'] = datetime.datetime.strptime(v, 'YOUR_TIME_FORMAT').time() 

Замените YOUR_TIME_FORMAT на формат времени ввода, который у вас есть.

1

Он не жалуется на то, как вы проходите переменные, он поднимает ValidationError, и мне смешно, что у него отсутствует последняя строка трассировки, которая сообщит нам, что не так с вашими значениями.

Я не тестировал BinaryField, но TimeField жалуется на вашу ценность. Я не тестировал BinaryField, но только глядя на TimeField, показывает следующее:

File "<console>", line 1, in <module> 
    File "/home/paco/Projects/sandeepbox/stackoverflow/bla/bla/field_validation.py", line 16, in <module> 
    print a.is_valid() 
    File "/home/paco/.virtualenvs/berou/local/lib/python2.7/site-packages/django/forms/forms.py", line 184, in is_valid 
    return self.is_bound and not self.errors 
    File "/home/paco/.virtualenvs/berou/local/lib/python2.7/site-packages/django/forms/forms.py", line 176, in errors 
    self.full_clean() 
    File "/home/paco/.virtualenvs/berou/local/lib/python2.7/site-packages/django/forms/forms.py", line 392, in full_clean 
    self._clean_fields() 
    File "/home/paco/.virtualenvs/berou/local/lib/python2.7/site-packages/django/forms/forms.py", line 407, in _clean_fields 
    value = field.clean(value) 
    File "/home/paco/.virtualenvs/berou/local/lib/python2.7/site-packages/django/forms/fields.py", line 162, in clean 
    value = self.to_python(value) 
    File "/home/paco/.virtualenvs/berou/local/lib/python2.7/site-packages/django/forms/fields.py", line 474, in to_python 
    return super(TimeField, self).to_python(value) 
    File "/home/paco/.virtualenvs/berou/local/lib/python2.7/site-packages/django/forms/fields.py", line 423, in to_python 
    for format in self.input_formats: 
    File "/home/paco/.virtualenvs/berou/local/lib/python2.7/site-packages/django/utils/functional.py", line 136, in __wrapper__ 
    res = func(*self.__args, **self.__kw) 
    File "/home/paco/.virtualenvs/berou/local/lib/python2.7/site-packages/django/utils/formats.py", line 110, in get_format 
    for module in get_format_modules(lang): 
    File "/home/paco/.virtualenvs/berou/local/lib/python2.7/site-packages/django/utils/formats.py", line 82, in get_format_modules 
    modules = _format_modules_cache.setdefault(lang, list(iter_format_modules(lang, settings.FORMAT_MODULE_PATH))) 
    File "/home/paco/.virtualenvs/berou/local/lib/python2.7/site-packages/django/utils/formats.py", line 51, in iter_format_modules 
    if not check_for_language(lang): 
    File "/home/paco/.virtualenvs/berou/local/lib/python2.7/site-packages/django/utils/translation/__init__.py", line 181, in check_for_language 
    return _trans.check_for_language(lang_code) 
    File "/home/paco/.virtualenvs/berou/local/lib/python2.7/site-packages/django/utils/lru_cache.py", line 125, in wrapper 
    result = user_function(*args, **kwds) 
    File "/home/paco/.virtualenvs/berou/local/lib/python2.7/site-packages/django/utils/translation/trans_real.py", line 409, in check_for_language 
    if not language_code_re.search(lang_code): 
TypeError: expected string or buffer 

со следующим кодом (нет необходимости для моделей, чтобы показать валидацию):

from django import forms 


class Test(forms.Form): 
    time = forms.TimeField() 

    def __str__(self): 
     return self.name 


kwargs = {'time': u'36.332'} 
a = Test(kwargs) 
print a.is_valid() 

Вам нужно передать в данных таким образом:

import datetime 

from django import forms 


class Test(forms.Form): 
    time = forms.TimeField() 

    def __str__(self): 
     return self.name 


kwargs = {'time': datetime.datetime.now().time()} 
a = Test(kwargs) 
print a.is_valid() 

код, на этот раз, фактически печатает True