Django PostgreSQL db_index di JSONField untuk melakukan kueri dengan kunci yang tepat

Saya memiliki model Tempat:

class Place(models.Model):

    ... some not interesting fields

    distances = models.JSONField()

Di JSONField (jarak) menyimpan sesuatu seperti:

{
    '1': 10
    '2': 20
    '3': 30
    '4': 40
    ...
    '1000': 10000
}

di mana kuncinya adalah 'id' dari beberapa model Lokasi, dan nilai - 'waktu perjalanan' ke Lokasi ini dari Tempat ini

Jika pengguna situs web memilih Lokasi, saya menampilkan Tempat secara berurutan dari yang terdekat hingga yang terjauh dari Lokasi yang dipilih:

places = Place.objects.all().order_by(
    RawSQL('distances->%s', (str(selected_location_id),))
)

Dan semuanya keren, kecuali performa.

Namun, PostgreSQL mendukung pengindeksan untuk bidang JSONB (yang menggunakan Django untuk JSONField):

GIN, btree dan hash

  1. Apa perbedaan di antara keduanya? Mana yang cocok untuk contoh saya?
  2. Apakah Django mendukung db_index di JSONField? Jika ya, bagaimana cara menentukan indeks mana yang akan digunakan?

Terima kasih banyak atas bantuannya!


person MaxCore    schedule 25.06.2016    source sumber
comment
Kemungkinan duplikat Cara menentukan jenis indeks apa untuk digunakan di Postgres?   -  person e4c5    schedule 26.06.2016
comment
Sebagian besar pertanyaan Anda dijawab oleh pertanyaan terkait. Selebihnya sepertinya situasi di mana Anda tidak boleh menggunakan jsonb   -  person e4c5    schedule 26.06.2016


Jawaban (1)


Untuk mengindeks kunci tertentu di json, buat migrasi sql mentah:

  1. Jalankan ./manage.py makemigrations --empty yourApp di mana yourApp adalah aplikasi model yang ingin Anda ubah indeksnya.

  2. Edit migrasi mis.

operations = [
    migrations.RunSQL("CREATE INDEX idx_name ON your_table((json_field->>'json_key'));")
]

Dimana idx_name adalah nama indeks, your_table adalah tabel Anda, json_field adalah JSONField Anda, dan json_key dalam hal ini adalah kunci yang ingin Anda indeks.

Tidak yakin apakah ada pembungkus asli untuk hal semacam ini di Django, saya mencari dan tidak dapat menemukannya tetapi ini harusnya berhasil. Anda mungkin ingin mencatat bahwa indeks ini dibuat melalui migrasi ini di meta model Anda juga. Bersulang!

person radtek    schedule 22.09.2020