يمكن تخزين دجانغو أورم عدد صحيح 64 بت غير موقعة (ويعرف أيضا باسم أولونغ 64 أو يونت 64) بطريقة الخلفية الملحد موثوق?

StackOverflow https://stackoverflow.com//questions/10678102

سؤال

كل المستندات التي رأيتها تعني أنك قد تكون قادرة على القيام بذلك ، ولكن ليس هناك أي شيء رسمي ث/ص/ر أولونغ 64/يونت 64 الحقول.هناك عدد قليل من الخيارات الجاهزة التي تبدو واعدة جدا في هذه الساحة:

  • BigIntegerField ...تقريبا ، ولكن وقعت;
  • PositiveIntegerField ...مثير للريبة 32 بت المظهر;و
  • DecimalField ...مؤشر ثابت ممثلة مع الثعبان decimal نوع ، وفقا ل المستندات -- الذي يفترض أن يتحول إلى حقل قاعدة بيانات متحذلق وبطيئة مماثلة عندما مضروب بعيدا ، - لا أنواع بوستغريزل العشرية أو الرقمية.

...كل منها انظر مثل هم قد تخزين عدد من هذا القبيل.باستثناء أن أيا منهم لن يرتكب, يشبه إلى حد كبير كل شخصية روم كوم يصورها هيو جرانت.

معياري الأساسي هو أنه يعمل مع الخلفيات المدعومة من جانغو ، دون أي if postgresql (...) elif mysql (...) نوع من هراء حالة خاصة.بعد ذلك ، هناك حاجة للسرعة-وهذا هو لحقل نموذج في تطبيق قاعدة بيانات مرئية من شأنها أن مؤشر البيانات المستمدة من الصورة (على سبيل المثال.التجزئات الإدراكية وميزات النقاط الرئيسية المستخرجة) ، مما يسمح بالترتيب والتجميع حسب محتوى تلك الصور.

لذا:هل هناك تمديد جانغو جيد أو التطبيق الذي يقدم نوعا من PositiveBigIntegerField التي تناسب أغراض بلدي?

وباستثناء ذلك:إذا كان هناك طريقة بسيطة وموثوق بها لاستخدام الأسهم أورم جانغو لتخزين إنتس 64 بت غير الموقعة ، أود أن أعرف ذلك.انظروا ، أنا لا أزيز ثنائي;لا بد لي من القيام تكملة اثنين على الورق-حتى إذا كان هذا الأسلوب من يدكم ينطوي على بعض الخداع قليلا التحول ، لا تتردد في شرح ما هو عليه ، حتى لو كان يضرب لك كما هو واضح.شكرا مقدما.

هل كانت مفيدة؟

المحلول

على الرغم من أنني لم اختبار ذلك ، ولكن قد ترغب في فئة فرعية فقط BigIntegerField.الأصل BigIntegerField يبدو أن (المصدر هنا):

class BigIntegerField(IntegerField):
    empty_strings_allowed = False
    description = _("Big (8 byte) integer")
    MAX_BIGINT = 9223372036854775807

    def get_internal_type(self):
        return "BigIntegerField"

    def formfield(self, **kwargs):
        defaults = {'min_value': -BigIntegerField.MAX_BIGINT - 1,
                    'max_value': BigIntegerField.MAX_BIGINT}
        defaults.update(kwargs)
        return super(BigIntegerField, self).formfield(**defaults)

مشتقة PositiveBigIntegerField قد يبدو مثل هذا:

class PositiveBigIntegerField(BigIntegerField):
    empty_strings_allowed = False
    description = _("Big (8 byte) positive integer")

    def db_type(self, connection):
        """
        Returns MySQL-specific column data type. Make additional checks
        to support other backends.
        """
        return 'bigint UNSIGNED'

    def formfield(self, **kwargs):
        defaults = {'min_value': 0,
                    'max_value': BigIntegerField.MAX_BIGINT * 2 - 1}
        defaults.update(kwargs)
        return super(PositiveBigIntegerField, self).formfield(**defaults)

على الرغم من أنه يجب عليك اختباره جيدا ، قبل استخدامه.إذا قمت بذلك ، يرجى مشاركة النتائج :)

تحرير:

فاتني شيء واحد-تمثيل قاعدة البيانات الداخلية.يعتمد هذا على القيمة التي تم إرجاعها بواسطة get_internal_type() ويتم تخزين تعريف نوع العمود على سبيل المثال. هنا في حالة الخلية الخلفية وتحديد هنا.يبدو وكأنه الكتابة db_type() سوف تعطيك السيطرة على كيفية تمثيل الحقل في قاعدة البيانات.ومع ذلك ، سوف تحتاج إلى إيجاد طريقة لإرجاع القيمة الخاصة بنظام إدارة قواعد البيانات في db_type() عن طريق التحقق connection حجة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top