Mi clase se ve así:
class Foo(models.Model): known_by = JSONField()Mis datos se ven así
{ "known_by" : [ {'by':'name1', 'value':['def']}, {'by':'name2', 'value':['bar']} ] } ¿Hay alguna forma de hacer cumplir que Jsonfield debe seguir el formato de by,value[] dict? Sé cómo hacer esto usando serialiazers
¿Alguna otra forma más limpia de hacer cumplir esto (en la definición del modelo en sí)? Gracias
Puede agregar un validador al campo del modelo, así:
class Foo(models.Model): known_by = ArrayField(JSONField(max_length=100), size=4, validators=[a_json_array_validator])Y el validador es:
def a_json_array_validator(value): if any([not is_json_valid(entry) for entry in value]): raise ValidationError( _('%(value) is not a valid json'), params={'value': value}, )(La validación real de json depende de usted) ;-) Tenga en cuenta que los validadores reciben objetos de python, por lo que en realidad es un dict.
Podrías implementarlo de esta manera:
from django.db import models class Bar(models.Model): by = models.CharField() value = models.ArrayField() class Foo(models.Model): known_by = models.ForeignKey(Bar, on_delete=models.CASCADE)¿Por qué no simplemente anular el método de guardar para hacer la aplicación?
class Foo(models.Model): known_by = JSONField() def save(self, *args, **kwargs): # begin validation code # end validation code if valid: super(Model, self).save(*args, **kwargs) else: # something else, maybe http error code?