জ্যাঙ্গো মডেলে সংখ্যার ক্ষেত্রের সর্বাধিক মান কীভাবে সীমাবদ্ধ?


169

জ্যাঙ্গোর বিভিন্ন সংখ্যাসূচক ক্ষেত্র রয়েছে যেমন মডেলগুলিতে ব্যবহারের জন্য, যেমন: ডেসিমালফিল্ড এবং পজিটিভ ইন্টেজারফিল্ড । যদিও পূর্ববর্তীটি দশমিক স্থানের সঞ্চিত সংখ্যার এবং সঞ্চিত অক্ষরের সামগ্রিক সংখ্যার মধ্যে সীমাবদ্ধ করা যেতে পারে, তবে কোনও নির্দিষ্ট পরিসরের মধ্যে কেবলমাত্র সংখ্যাগুলি সংরক্ষণ করার জন্য এটি কি সীমাবদ্ধ করার কোনও উপায় আছে , উদাহরণস্বরূপ ০.০-৫.০?

এটি ব্যর্থ হয়ে, পজিটিভ ইন্টেগারফিল্ড কেবলমাত্র স্টোরের মধ্যে সীমাবদ্ধ করার কোনও উপায় আছে, উদাহরণস্বরূপ, সংখ্যা 50 পর্যন্ত?

আপডেট: এখন বাগ 6845 বন্ধ হয়ে গেছে , এই স্ট্যাকওভারফ্লো প্রশ্নটি মোটা হতে পারে। - সাম্পব্লুকুপার


আপনি একটি প্রাক-সংরক্ষণের সিগন্যাল তৈরি করতে পারেন: http://docs.djangoproject.com/en/dev/ref/signals/#django.db.models.signals.pre_save
igorgue

আমার উল্লেখ করা উচিত ছিল যে আমি জাঙ্গোর প্রশাসকের মধ্যেও এই বিধিনিষেধ প্রয়োগ করতে চাই। এটি পাওয়ার জন্য, কমপক্ষে, ডকুমেন্টেশনে এই কথাটি
en

প্রকৃতপক্ষে, প্রাক -১.০ জ্যাঙ্গোর মনে হয় সত্যিই মার্জিত সমাধান রয়েছে: কোটেলিজ.নেট / ২০০7 / ১২ / 11/… । আমি ভাবছি জ্যাঙ্গোর এসএনএন রিলিজে এটি করার মতো সমান মার্জিত উপায় আছে কিনা?
সাম্পাব্লুকুপার

আমি জেনে হতাশ হয়েছি যে বর্তমান জাজানো এসএনএন দিয়ে এটি করার কোনও মার্জিত উপায় বলে মনে হচ্ছে না । আরও তথ্যের জন্য এই আলোচনার থ্রেডটি দেখুন: গ্রুপ. google.com/group/django-users/browse_thread/thread/…
সাম্পাব্লুকপার

মডেলটিতে ভ্যালিডেটর ব্যবহার করুন, এবং বৈধতা অ্যাডমিন ইন্টারফেসে এবং মডেলফর্মগুলিতে কাজ করবে: ডকস.ডজ্যাঙ্গোপ্রজেক্ট
এএন /

উত্তর:


133

আপনি একটি কাস্টম মডেল ক্ষেত্রের ধরণও তৈরি করতে পারেন - দেখুন http://docs.djangoproject.com/en/dev/howto/custom-model-fields/#howto-custom-model-fields

এই ক্ষেত্রে, আপনি অন্তর্নির্মিত ইন্টিজারফিল্ড থেকে 'উত্তরাধিকারী' হতে এবং এর বৈধতা যুক্তিকে ওভাররাইড করতে পারেন।

আমি এই সম্পর্কে যত বেশি চিন্তা করি, আমি বুঝতে পারি এটি অনেক জ্যাঙ্গো অ্যাপ্লিকেশনের জন্য কতটা কার্যকর। জাঙ্গো ডেভসদের ট্রাঙ্কে যুক্ত করার বিষয়টি বিবেচনা করার জন্য প্যাচ হিসাবে কোনও ইন্টিজারঞ্জেজফিল্ড টাইপ জমা দেওয়া যেতে পারে।

এটি আমার পক্ষে কাজ করছে:

from django.db import models

class IntegerRangeField(models.IntegerField):
    def __init__(self, verbose_name=None, name=None, min_value=None, max_value=None, **kwargs):
        self.min_value, self.max_value = min_value, max_value
        models.IntegerField.__init__(self, verbose_name, name, **kwargs)
    def formfield(self, **kwargs):
        defaults = {'min_value': self.min_value, 'max_value':self.max_value}
        defaults.update(kwargs)
        return super(IntegerRangeField, self).formfield(**defaults)

তারপরে আপনার মডেল শ্রেণিতে আপনি এটি ব্যবহার করতে পারবেন (ক্ষেত্রটি মডিউল যেখানে আপনি উপরের কোডটি রেখেছেন):

size = fields.IntegerRangeField(min_value=1, max_value=50)

বা নেতিবাচক এবং ধনাত্মক (একটি দোলক রেঞ্জের মতো) এর একটি ব্যাপ্তির জন্য:

size = fields.IntegerRangeField(min_value=-100, max_value=100)

সত্যিই দুর্দান্ত কি তা যদি এটির মতো রেঞ্জ অপারেটরের সাথে ডাকা যেতে পারে:

size = fields.IntegerRangeField(range(1, 50))

তবে, এর জন্য আরও অনেক কোডের প্রয়োজন হবে যেহেতু আপনি একটি 'স্কিপ' প্যারামিটার - রেঞ্জ (1, 50, 2) নির্দিষ্ট করতে পারেন - যদিও আকর্ষণীয় ধারণা ...


এটি কাজ করে তবে যখন মডেলের পরিষ্কার পদ্ধতিতে পূর্ণসংখ্যার মান সর্বদা কোনও হয় না যা এটি তৈরি করে তাই আমি এটিতে কোনও অতিরিক্ত পরিষ্কারের ব্যবস্থা করতে পারি না। এটি কেন এবং কীভাবে এটি ঠিক করবেন কোনও ধারণা?
KrisF

2
MinValueValidator(min_value) and MaxValueValidator(max_value)কল করার আগে আপনি নিজের কাস্টম ক্ষেত্রটি বাড়িয়ে তুলতে পারেন super().__init__ ...(স্নিপেট: gist.github.com/madneon/147159f46ed478c71d5ee4950a9d697d )
ম্যাডনিয়ন

348

আপনি জ্যাঙ্গোর বিল্ট-ইন ভ্যালিডিটার ব্যবহার করতে পারেন -

from django.db.models import IntegerField, Model
from django.core.validators import MaxValueValidator, MinValueValidator

class CoolModelBro(Model):
    limited_integer_field = IntegerField(
        default=1,
        validators=[
            MaxValueValidator(100),
            MinValueValidator(1)
        ]
     )

সম্পাদনা : মডেলটির সাথে সরাসরি কাজ করার সময়, ভ্যালিডেটরদের ট্রিগার করার জন্য মডেলটি সংরক্ষণের আগে মডেলটিকে ফুল_ক্যালান পদ্ধতিতে কল করতে ভুলবেন না । ModelFormযেহেতু ফর্মগুলি স্বয়ংক্রিয়ভাবে এটি ব্যবহার করবে তখন এটি ব্যবহার করার দরকার নেই ।


4
আমার ধারণা আপনি যদি নিজেরাই নিজের বৈধ লেখকটি লিখতে চান তবে আপনি যদি চান সীমাবদ্ধ_আপনার_ফিল্ডটি optionচ্ছিকও হয়? (ফাঁকা না হলে কেবল বৈধতার পরিসর) নাল = সত্য, ফাঁকা = সত্য এটি করেনি ..
র‌্যাডটেক

2
জ্যাঙ্গোতে 1.7 সেটিং null=Trueএবং blank=Trueপ্রত্যাশার মতো কাজ করে। ক্ষেত্রটি isচ্ছিক এবং যদি এটি ফাঁকা ছেড়ে যায় তবে এটি নাল হিসাবে সংরক্ষণ করা হয়।
টিম টিসডাল

77
from django.db import models
from django.core.validators import MinValueValidator, MaxValueValidator

size = models.IntegerField(validators=[MinValueValidator(0),
                                       MaxValueValidator(5)])

52

আমার খুব একই সমস্যা ছিল; এখানে আমার সমাধান ছিল:

SCORE_CHOICES = zip( range(1,n), range(1,n) )
score = models.IntegerField(choices=SCORE_CHOICES, blank=True)

10
একটি তালিকা বোধগম্যতা ব্যবহার করে:models.IntegerField(choices=[(i, i) for i in range(1, n)], blank=True)
রাজ্জি আবুইসা

10

এই কাজটি করার দুটি পদ্ধতি আছে। একটি হ'ল ফর্মের বৈধতা ব্যবহারের জন্য 50 এর বেশি সংখ্যক কোনও ব্যবহারকারীর দ্বারা প্রবেশ করা যায় না। বৈধতা ডক্স ফরম

যদি প্রক্রিয়াটিতে কোনও ব্যবহারকারী জড়িত না থাকে বা আপনি ডেটা প্রবেশের জন্য কোনও ফর্ম ব্যবহার করছেন না, তবে আপনাকে saveব্যতিক্রম ছুঁড়ে ফেলার জন্য মডেলটির পদ্ধতিটি ওভাররাইড করতে হবে বা ক্ষেত্রের মধ্যে যাওয়া ডেটা সীমিত করতে হবে।


2
অ-মানবিক ইনপুটকে বৈধতা দেওয়ার জন্য আপনি একটি ফর্মও ব্যবহার করতে পারেন। এটি চারদিকে বৈধকরণ কৌশল হিসাবে ফর্মটি জনপ্রিয় করতে দুর্দান্ত কাজ করে।
এস .লট

1
এটি চিন্তা করার পরে, আমি নিশ্চিত যে আমি কোনও ফর্মের মধ্যে বৈধতা রাখতে চাই না। কোন ধরণের পরিসীমা গ্রহণযোগ্য তা প্রশ্ন মডেলটির একটি অংশ যেমন কোন ধরণের গ্রহণযোগ্য কিনা তা প্রশ্ন। মডেলটি সম্পাদনযোগ্য এমন প্রতিটি ফর্মটি আমি বলতে চাই না, কেবল কোন পরিসরের সংখ্যা গ্রহণ করতে হয়। এটি ডিআরওয়াই লঙ্ঘন করবে এবং এর পাশাপাশি এটি কেবল সাধারণ অনুপযুক্ত। সুতরাং আমি মডেলটির সংরক্ষণ পদ্ধতিটি ওভাররাইড করা বা সম্ভবত একটি কাস্টম মডেল ফিল্ডের ধরণ তৈরি করতে যাচ্ছি - যদি না আমি এর থেকে আরও ভাল উপায় খুঁজে না
পাই

tghw, আপনি বলেছিলেন যে আমি "একটি ব্যতিক্রম ছুঁড়তে বা ক্ষেত্রের মধ্যে যাওয়া ডেটা সীমাবদ্ধ করার জন্য মডেলটির সংরক্ষণের পদ্ধতিটিকে ওভাররাইড করতে পারি" " মডেল সংজ্ঞায়নের ওভাররডিন সেভ () পদ্ধতির মধ্যে থেকে - আমি কীভাবে এটি তৈরি করব যাতে প্রবেশ করা নম্বর যদি একটি নির্দিষ্ট পরিসরের বাইরে থাকে তবে ব্যবহারকারী একটি বৈধতা ত্রুটিটি এতটা গ্রহণ করতে পারে যেন সে একটি অঙ্কের ক্ষেত্রে অক্ষরের ডেটা প্রবেশ করেছিল? অর্থাৎ আমি এমন কিছু উপায় করতে পারি যা ব্যবহারকারীর অ্যাডমিনের মাধ্যমে সম্পাদনা করা হচ্ছে বা অন্য কোনও ফর্মের মাধ্যমে নির্বিশেষে কাজ করবে? ব্যবহারকারীদের কী হচ্ছে তা না জানিয়ে আমি কেবল ক্ষেত্রের মধ্যে যাওয়া ডেটা সীমাবদ্ধ করতে চাই না :) ধন্যবাদ!
সাম্পাব্লুকুপার

এমনকি যদি আপনি পদ্ধতি "সংরক্ষণ করুন", এই অভ্যস্ত কাজ যখন MyModel.object.filter মত QuerySet মাধ্যমে টেবিল আপডেট (blabla) .update (blabla) সংরক্ষণ করুন, যাতে কোনো চেক করা হবে কল করা হবে না ব্যবহার
অলিভিয়ের Pons

5

আপনি যদি কিছু অতিরিক্ত নমনীয়তা চান এবং আপনার মডেল ক্ষেত্রটি পরিবর্তন করতে না চান তবে এখানে সেরা সমাধান is কেবল এই কাস্টম যাচাইকারী যুক্ত করুন:

#Imports
from django.core.exceptions import ValidationError      

class validate_range_or_null(object):
    compare = lambda self, a, b, c: a > c or a < b
    clean = lambda self, x: x
    message = ('Ensure this value is between %(limit_min)s and %(limit_max)s (it is %(show_value)s).')
    code = 'limit_value'

    def __init__(self, limit_min, limit_max):
        self.limit_min = limit_min
        self.limit_max = limit_max

    def __call__(self, value):
        cleaned = self.clean(value)
        params = {'limit_min': self.limit_min, 'limit_max': self.limit_max, 'show_value': cleaned}
        if value:  # make it optional, remove it to make required, or make required on the model
            if self.compare(cleaned, self.limit_min, self.limit_max):
                raise ValidationError(self.message, code=self.code, params=params)

এবং এটি যেমন ব্যবহার করা যেতে পারে:

class YourModel(models.Model):

    ....
    no_dependents = models.PositiveSmallIntegerField("How many dependants?", blank=True, null=True, default=0, validators=[validate_range_or_null(1,100)])

দুটি পরামিতি সর্বাধিক এবং ন্যূনতম এবং এটি নালগুলিকে অনুমতি দেয়। আপনি যদি বিবৃতি দিয়ে চিহ্নিত চিহ্ন থেকে মুক্তি পেয়ে বা আপনার ক্ষেত্রটি ফাঁকা = মিথ্যা, নাল = মডেলটিতে মিথ্যা হিসাবে পরিবর্তন করতে চান তবে আপনি বৈধকরণকারীটিকে কাস্টমাইজ করতে পারেন। এটি অবশ্যই একটি অভিবাসন প্রয়োজন।

দ্রষ্টব্য: আমাকে ভ্যালিডেটর যুক্ত করতে হয়েছিল কারণ জাজানো পজিটিভস্ম্যালআইঞ্জারফিল্ডে সীমাটি বৈধতা দেয় না, পরিবর্তে এটি এই ক্ষেত্রের জন্য একটি ছোট (পোস্টগ্র্যাসে) তৈরি করে এবং যদি নির্দিষ্ট সংখ্যার সীমা ছাড়িয়ে যায় তবে আপনি একটি ডিবি ত্রুটি পাবেন।

আশা করি এটি সাহায্য করবে :) জ্যাঙ্গোর ভ্যালিডেটর সম্পর্কিত আরও ।

পুনশ্চ. আমি আমার উত্তর django.core. লাডিয়ালিটারগুলিতে বেসভালিডেটরের উপর ভিত্তি করে তৈরি করেছি, তবে কোড ব্যতীত সবকিছু আলাদা।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.