यदि आप किसी फ़ील्ड को blank=True के साथ परिभाषित करते हैं तो सत्यापन ठीक से रिक्त मानों की अनुमति देता है और यदि blank=False तो रिक्त मान एक सत्यापन अपवाद उत्पन्न करते हैं। आमतौर पर यह बहुत आसान है, लेकिन JSONField के साथ 3 अलग-अलग रिक्त मानों में से एक होना संभव है जो हैं: '', [], {}। अनिवार्य रूप से, मैं केवल {} को ही स्वीकार्य रिक्त मान के रूप में अनुमति देना चाहता हूं। हालांकि, कस्टम फ़ील्ड सत्यापनकर्ताओं को रिक्त मान कभी भी पास नहीं किए जाते हैं, इसलिए ऐसा लगता है कि मानक माध्यमों से यह संभव नहीं है।

def validate_dict(value):
    if not isinstance(value, dict):
        raise ValidationError(
            '"%(value)s" is not valid JSON',
            params={'value': value},
        )

class MyModel(models.Model):
    json = JSONField(default=dict, blank=True, validators=[validate_dict])

उपरोक्त उदाहरण में, सभी "रिक्त" मानों को तुरंत मान्य के रूप में देखा जाता है और validate_dict को कभी नहीं कहा जाता है। अगर मैं blank=True को blank=False में बदलता हूं तो सभी खाली मान तुरंत अमान्य के रूप में देखे जाते हैं और फिर validate_dict को कभी भी कॉल नहीं किया जाता है।

मैं सत्यापित करना चाहता हूं कि संग्रहीत डेटा हमेशा एक dict होता है, लेकिन यह सत्यापित करना असंभव प्रतीत होता है कि खाली मान केवल dict है।

2
Tim Tisdall 28 फरवरी 2020, 00:25

1 उत्तर

सबसे बढ़िया उत्तर

मुझे https://stackoverflow.com/a/56271722/918558 मिला, जिससे पता चलता है कि मैं इस मुद्दे को हल कर सकता हूं। निम्नलिखित:

def validate_dict(value):
    if not isinstance(value, dict):
        raise ValidationError(
            '"%(value)s" is not valid JSON',
            params={'value': value},
        )


class DictJSONField(JSONField):
    empty_values = [{}]
    default_validators = [validate_dict]


class MyModel(models.Model):
    json = DictJSONField(default=dict, blank=True)

ऐसा हमेशा लगता है कि SO में प्रश्न तैयार करने के तुरंत बाद आपको उत्तर मिल जाता है। (हालांकि मैंने अभी तक इसका परीक्षण नहीं किया है)

2
Tim Tisdall 17 मार्च 2020, 18:31