3

我的類看起來是這樣的:Django的JSONField有特定的鍵

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

我的數據是這樣的

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

有什麼辦法,我執行了Jsonfield需要遵循格式的by,value[]字典。我知道如何使用serialiazers

任何其他更清晰的方式來執行此操作(在模型定義本身)?由於

+1

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

回答

1

您可以實現這樣說:

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

您可以將驗證器添加到模型字段,就像這樣:

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

而且驗證是:

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

(實際的json驗證取決於你);-) 請注意,驗證器接收python obje因此它實際上是一個字典。

+1

不,這是行不通的。首先 - 一個'ArrayField'內不能有'JSONField',它會拋出一個錯誤! –

+1

我假設提供的代碼工作。您只能使用JSONField並使用驗證器。問題不在於提供確切的解決方案,而是想法。乾杯。 – Joaquin

+1

嘿!謝謝你指出。我編輯它。事實上,我實施了類似的代碼,你在那裏回來了。但現在我想知道是否有更好的方法:)謝謝你花時間回覆。對不起,如果我是粗魯的。 –

0

爲什麼不重寫保存方法來執行強制?

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?