Commit c5a25c27 authored by Claude Paroz's avatar Claude Paroz
Browse files

Add introspection support for BinaryField

parent d680a3f4
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@ foreign_key_re = re.compile(r"\sCONSTRAINT `[^`]*` FOREIGN KEY \(`([^`]*)`\) REF
class DatabaseIntrospection(BaseDatabaseIntrospection):
    # Maps type objects to Django Field types.
    data_types_reverse = {
        cx_Oracle.BLOB: 'BinaryField',
        cx_Oracle.CLOB: 'TextField',
        cx_Oracle.DATETIME: 'DateField',
        cx_Oracle.FIXED_CHAR: 'CharField',
+1 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@ class DatabaseIntrospection(BaseDatabaseIntrospection):
    # Maps type codes to Django Field types.
    data_types_reverse = {
        16: 'BooleanField',
        17: 'BinaryField',
        20: 'BigIntegerField',
        21: 'SmallIntegerField',
        23: 'IntegerField',
+1 −0
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ class FlexibleFieldLookupDict(object):
        'real': 'FloatField',
        'text': 'TextField',
        'char': 'CharField',
        'blob': 'BinaryField',
        'date': 'DateField',
        'datetime': 'DateTimeField',
        'time': 'TimeField',
+1 −0
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@ class Reporter(models.Model):
    last_name = models.CharField(max_length=30)
    email = models.EmailField()
    facebook_user_id = models.BigIntegerField(null=True)
    raw_data = models.BinaryField(null=True)

    class Meta:
        unique_together = ('first_name', 'last_name')
+6 −2
Original line number Diff line number Diff line
@@ -60,9 +60,13 @@ class IntrospectionTests(TestCase):
    def test_get_table_description_types(self):
        cursor = connection.cursor()
        desc = connection.introspection.get_table_description(cursor, Reporter._meta.db_table)
        # The MySQL exception is due to the cursor.description returning the same constant for
        # text and blob columns. TODO: use information_schema database to retrieve the proper
        # field type on MySQL
        self.assertEqual(
            [datatype(r[1], r) for r in desc],
            ['IntegerField', 'CharField', 'CharField', 'CharField', 'BigIntegerField']
            ['IntegerField', 'CharField', 'CharField', 'CharField',
             'BigIntegerField', 'BinaryField' if connection.vendor != 'mysql' else 'TextField']
        )

    # The following test fails on Oracle due to #17202 (can't correctly
@@ -85,7 +89,7 @@ class IntrospectionTests(TestCase):
        desc = connection.introspection.get_table_description(cursor, Reporter._meta.db_table)
        self.assertEqual(
            [r[6] for r in desc],
            [False, False, False, False, True]
            [False, False, False, False, True, True]
        )

    # Regression test for #9991 - 'real' types in postgres