سؤال

أحاول تصميم أ VARBINARY حقل MySQL في Django v1.1.1. يخزن المجال الثنائي تمثيلًا سداسيًا للبيانات (أي يمكن للمرء استخدامه INSERT INTO test(bin_val) VALUES X'4D7953514C')

قراءة وثائق Django [1] لقد توصلت إلى هذا sollution:

class MyTest(models.Model):
    bin_val = BinValField()

class BinValField(models.Field):
    __metaclass__ = models.SubfieldBase

    def to_python(self, value):
        """ DB -> Python """
        return ''.join('%X%X' % ((ord(byte)>>4) & 0xF, ord(byte) & 0xF) for byte in value)

    def get_db_prep_value(self, value):
        """ Python -> DB """
        return a2b_hex(value).decode('latin1')

لكن هذا لا يعمل بشكل صحيح لأن:

  • يقوم Django بتحويل Unicode للبيانات الثنائية من MySQL
  • عند حفظ كائن mytest جديد ، get_db_prep_value() يتم استدعاؤه مرتين (أعتقد أن هذا خطأ في Django؟)

والسؤال هو كيف يمكنك تصميم مثل هذا الحقل؟

ملاحظة: تتعلق بهذه المشكلة هي هذه التذكرة [2] التي لا تزال مفتوحة بعد 3 سنوات :(

1] Django: كتابة حقول نموذج مخصصة

[2] http://code.djangoproject.com/ticket/2417

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

المحلول

كانت المشكلة هي الطريقة التي يقوم بها Django بإنشاء جداول قاعدة البيانات وكان مرتبطًا أيضًا بتجميع قاعدة البيانات.

الطريقة التي حللت بها هي ما يلي:

  • غيرت الجدول charset إلى utf8 والترتيب ل utf8_bin
  • غيرت المجال الثنائي من VARCHAR ل VARBINARY في جدول MySQL
  • تستخدم في to_python طريقة return hexlify(value)

نصائح أخرى

نفس التذكرة التي أشرت إليها أيضًا التصحيح والتي يجب أن تعطي بعض المؤشرات نحو تنفيذ هذا المجال.

في أي حال ، ما هي مشكلتك الحقيقية لتخزينها في تشارفيلد؟

حتى لو كنت ستنفذ حقل بن ، يمكنك فقط تمديد النماذج. تشارفيلد وإلقاءها على Hex في طريقة to_python.

كما تم الإجابة على نفس السؤال سابقًا: تخزين قيمة التجزئة الثنائية في حقل نموذج Django

MySQL لا تخزين تمثيل سداسي عشري لحقول varbinary ولا تتطلب ذلك في بيان إدراج. الفرق الوحيد من Varchar هو أن MySQL يستخدم الترتيب الثنائي لذلك. يمكنك تمرير أي سلسلة 8 بت كمعلمة لذلك.

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