3

Meine Klasse sieht wie folgt haben:Django JSONField bestimmten Schlüssel

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

Meine Daten wie diese für mich, dass die Jsonfield Bedürfnisse das Format zu folgen, um zu erzwingen

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

Gibt es eine Möglichkeit sieht von by,value[] dict. Ich weiß, wie man das macht mit serialiazers

Jeder andere sauberere Weg, um dies durchzusetzen (in der Modelldefinition selbst)? Dank

+1

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

Antwort

1

Man könnte es auf diese Weise implementieren:

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

Sie können einen Validator zum Modell Feld hinzuzufügen, wie folgt aus:

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

Und der Validator ist:

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}, 
     ) 

(Die eigentliche JSON-Validierung liegt bei Ihnen) ;-) Beachten Sie, dass Validatoren Python Obje erhalten Es ist also eigentlich ein Diktat.

+1

Nein, das wird nicht funktionieren. Zuallererst - Man kann kein 'JSONField' in einem 'ArrayField' haben, das wird einen Fehler auslösen! –

+1

Ich ging davon aus, dass der bereitgestellte Code funktioniert. Sie können nur das JSONField verwenden und einen Validator verwenden. Es ging nicht um eine exakte Lösung, sondern um eine Idee. Prost. – Joaquin

+1

Hey! Danke, dass du es aufgezeigt hast. Ich habe es bearbeitet. In der Tat habe ich ähnliche Art von Code implementiert, den Sie dort vor 2 Wochen haben. Aber jetzt habe ich mich gefragt, ob es einen besseren Weg gibt :) Danke, dass du dir Zeit genommen hast zu antworten. Tut mir leid, wenn ich unhöflich war. –

0

Warum überschreiben Sie einfach die Speichermethode, um die Erzwingung durchzuführen?

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? 
Verwandte Themen