3

Ma classe ressemble à ceci:Django JSONField d'avoir des touches particulières

class Foo(models.Model): 
    known_by = JSONField() 

Mes données ressemble à ce

{ "known_by" : [ 
       {'by':'name1', 'value':['def']}, 
       {'by':'name2', 'value':['bar']} 
       ] 
} 

Est-il possible pour moi de faire respecter que les Jsonfield doit suivre le format de by,value[] dict. Je sais comment faire cela en utilisant serialiazers

Toute autre façon plus propre de faire respecter cela (dans la définition du modèle lui-même)? Merci

+1

essayer ce http://stackoverflow.com/questions/9686409/how-to-store-a-dictionary-in-a-django-database-models-field – badiya

Répondre

1

Vous pouvez implémenter cette façon:

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) 
2

Vous pouvez ajouter un validateur au champ de modèle, comme ceci:

class Foo(models.Model): 
    known_by = ArrayField(JSONField(max_length=100), size=4, validators=[a_json_array_validator]) 

Et le validateur est:

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 validation json actuelle dépend de vous) ;-) Notez que les valideurs reçoivent l'objet python cts donc c'est en fait un dict.

+1

Non cela ne fonctionnera pas. Tout d'abord - On ne peut pas avoir un 'JSONField' dans un' ArrayField' il va lancer une erreur! –

+1

Je supposais que le code fourni fonctionnait. Vous pouvez utiliser le JSONField uniquement et utiliser un validateur. Le but n'était pas de fournir une solution exacte, mais une idée. À votre santé. – Joaquin

+1

Hey! Je vous remercie de le faire remarquer. Je l'ai édité. En fait, j'ai mis en place un code similaire à celui que vous avez là-bas il y a deux semaines. Mais maintenant je me demandais s'il y avait un meilleur moyen :) Merci d'avoir pris le temps de répondre. Désolé si j'étais grossier. –

0

Pourquoi ne pas simplement remplacer la méthode de sauvegarde pour effectuer l'application?

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?