Ah! Fantastic! I love it when I make a dumb mistake because it's an easy 
solution!

Instead of:
class DummyModel(models.Model):
    dummyJson = JSONField(validators = [TestValidator])#Using class, wrong!

I should be doing:

class DummyModel(models.Model):
    dummyJson = JSONField(validators = [TestValidator()])#Using instance of 
class, right!

As for using a class as a validator, I am performing some complex 
validation on the data inside the JSON to ensure it adheres to a specific 
format above and beyond the normal JSON validation, so a class based 
validator seemed like the right way to go. I based this off things like the 
Regex validator in django.core.validators found here: 
https://docs.djangoproject.com/en/1.10/_modules/django/core/validators/#RegexValidator.
 
Perhaps this wasn't the right approach?

Thanks for your help!
-Ryan Causey

On Sunday, August 28, 2016 at 3:46:31 AM UTC-7, Daniel Roseman wrote:
>
> On Sunday, 28 August 2016 07:54:47 UTC+1, Ryan Causey wrote:
>>
>> So I've dug into this a little more, and I've come up with the debugger 
>> trace below.
>>
>> -> dummyModelInstance.full_clean()
>>   c:\program files\python35\lib\site-packages\django\db\models\base.py(
>> 1210)full_clean()
>> -> self.clean_fields(exclude=exclude)
>>   c:\program files\python35\lib\site-packages\django\db\models\base.py(
>> 1252)clean_fields()
>> -> setattr(self, f.attname, f.clean(raw_value, self))
>>   c:\program files\python35\lib\site-packages\django\db\models\fields\
>> __init__.py(592)clean()
>> -> self.run_validators(value)
>>   c:\program files\python35\lib\site-packages\django\db\models\fields\
>> __init__.py(544)run_validators()
>> -> v(value)
>> > c:\program files\python35\lib\site-packages\django\utils\deconstruct.py
>> (16)__new__()
>> -> def __new__(cls, *args, **kwargs):
>> (Pdb) ll
>>  16  ->         def __new__(cls, *args, **kwargs):
>>  17                 # We capture the arguments to make returning them 
>> trivial
>>  18                 obj = super(klass, cls).__new__(cls)
>>  19                 obj._constructor_args = (args, kwargs)
>>  20                 return obj
>>
>> For some reason, when run_validators() calls the custom TestValidator, it 
>> seems that a TestValidator object is constructed rather than entering the 
>> __call__() method of the class. I can't see a reason for this to happen, so 
>> what am I doing wrong here?
>>
>> Thanks,
>> -Ryan Causey
>>
>>>
>>>
> This isn't anything to do with JSONFields, but your misunderstanding about 
> what callables are and what `__call__` does. That is not a class method, 
> but an instance method; calling a class merely instantiates it (as you 
> should expect). Whatever is passed as a validator is called; if it's a 
> function, it will be executed, if it's an instance, its `__call__` method 
> will be called, but if it's a class it will be instantiated.
>
> I'm not sure why you are passing a class at all here. Normally a validator 
> is a method; if you need a class for some reason then you should pass an 
> *instance* of that class, not the class itself.
> -- 
> DR.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-users+unsubscr...@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/64097c88-4239-4631-96be-168260fd53b0%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to