38

私が見たすべてのドキュメントは、あなたがそれを行うことができるかもしれないことを暗示していますが、ulong64/uint64 フィールドを含む公式なものはありません。この分野で非常に有望に見える既製のオプションがいくつかあります。

  • BigIntegerField...ほとんどですが、署名されています。
  • PositiveIntegerField...疑わしいことに32ビットに見えます。と
  • DecimalField...ドキュメントdecimalによると、Pythonタイプで表される固定ポインタ-これはおそらく、DECIMALまたはNUMERIC PostgreSQLタイプのように、ソックされたときに同様にペダンティックで遅いデータベースフィールドに変わります。

...それらはすべて、そのような数値を格納しているように見えますヒュー・グラントが描いたすべてのロマンティックコメディのキャラクターと同じように、どれもコミットしないことを除いて。

私の主な基準は、Django のサポートされているバックエンドで動作しif postgresql (...) elif mysql (...)、特別なケースのナンセンスがないことです。その後、速度が必要になります。これは、画像から派生したデータ (知覚ハッシュや抽出されたキーポイント機能など) をインデックス化するビジュアル データベース アプリケーションのモデル フィールドであり、これらの画像のコンテンツによる順序付けとグループ化を可能にします。 .

PositiveBigIntegerFieldだから:私の目的に合ったものを提供する良いDjango拡張機能またはアプリはありますか?

そして、それを除いて: Django のストック ORM を使用して unsigned 64-bit int を格納する簡単で信頼できる方法があれば、それを知りたいです。ほら、私はバイナリの達人ではありません。私は紙の上で 2 の補数を計算しなければなりません -- したがって、あなたのこの方法にビットシフトのトリックが含まれている場合は、それが何であるかをためらわずに説明してください。前もって感謝します。

4

1 に答える 1

26

私はそれをテストしませんでしたが、単にサブクラス化することをお勧めします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)

使用する前に、十分にテストする必要があります。もしそうなら、結果を共有してください:)

編集

内部データベースの表現という 1 つのことを見逃していました。これは、によって返される値に基づいてget_internal_type()おり、列タイプの定義が格納されています。MySQL バックエンドの場合はhereで、ここで決定されます。上書きdb_type()すると、データベースでフィールドがどのように表現されるかを制御できるようになります。ただし、引数db_type()をチェックして DBMS 固有の値を返す方法を見つける必要があります。connection

于 2012-05-20T23:47:19.413 に答える