Lewati ke isi

hubungan

Ormar saat ini mendukung dua jenis hubungan:

  • Satu-ke-banyak (dan banyak-ke-satu) dengan bidang asing
  • Banyak-ke-banyak dengan ManyToBanyak bidang

Anda dapat menemukan contoh definisi yang sangat mendasar dari setiap hubungan di bawah ini.

Untuk mempelajari lebih lanjut tentang metode, kemungkinan, definisi, dll., baca bagian dokumentasi selanjutnya.

kunci asing

Untuk menentukan hubungan banyak-ke-satu, gunakan bidang kunci asing.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from typing import Dict, Optional, Union

import databases
import ormar
import sqlalchemy

DATABASE_URL = "sqlite:///test.db"

ormar_base_config = ormar.OrmarConfig(
    database=databases.Database(DATABASE_URL), metadata=sqlalchemy.MetaData()
)


class Department(ormar.Model):
    ormar_config = ormar_base_config.copy()

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)


class Course(ormar.Model):
    ormar_config = ormar_base_config.copy()

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)
    department: Optional[Union[Department, Dict]] = ormar.ForeignKey(Department)

!!! Tips Untuk mempelajari lebih lanjut tentang hubungan satu-ke-banyak, kunjungi bagian Kunci Asing

membalikkan kunci asing

Definisi hubungan satu-ke-banyak juga menggunakan ForeignKey, yang secara otomatis mendaftarkan Anda.

Oleh karena itu, dalam hal contoh di atas.

1
2
3
4
5
6
7
8
Departemen Kelas (ormar. Model):
    ormar _ config = base _ ormar _ config copy ()

    Id: int = ormar. Integer (primary _ key = Benar)
    Nama: str = ormar. String (max _ length = 100)
    # ada bidang virtual di sini seperti berikut
    Kursus: Opsional [Daftar [Kursus]] = ormar. ForeignKey (Kursus, virtual = Benar)
    # perhatikan bahwa Anda TIDAK mendefinisikannya sendiri, ormar melakukannya untuk Anda.

!!!Tip Untuk mempelajari lebih lanjut tentang hubungan banyak-ke-satu (yaitu mengubah nama bidang yang dihasilkan), kunjungi bagian Kunci Asing

!!!Tip ReverseforeignKey memungkinkan Anda untuk menanyakan model terkait menggunakan queryset-proxy.

1
Ini memungkinkan Anda menggunakan `await department.courses.all()` untuk mengambil data yang hanya terkait dengan departemen tertentu, dll.

# banyak untuk banyak orang

Untuk menentukan hubungan banyak-ke-banyak, gunakan bidang ManyToMany.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
Kategori Kelas (ormar. Model):
    ormar _ config = ormar. OrmarConfig (
        Database = database,
        Metadata = metadata,
        Nama tabel = "kategori,"
    )

    Id: int = ormar. Integer (primary _ key = Benar)
    Nama: str = ormar. String (max _ length = 40)

Pos Kelas (ormar. Model):
    ormar _ config = ormar. OrmarConfig (
        Database = database,
        Metadata = metadata,
    )

    Id: int = ormar. Integer (primary _ key = Benar)
    Judul: str = ormar. String (max _ length = 200)
    Kategori: Opsional [Daftar [Kategori]] = ormar. Banyak (Kategori)

!!! Tips Untuk mempelajari lebih lanjut tentang banyak-ke-banyak hubungan, kunjungi bagian banyak-ke-banyak

!!!Tip ManyToBanyak memungkinkan Anda untuk menanyakan model terkait menggunakan queryset-proxy.

1
Ini memungkinkan Anda untuk menggunakan `await post.categories.all()` tetapi juga `await category.posts.all()` untuk mengambil data yang hanya terkait dengan posting tertentu, kategori dll.

Melalui ladang

Sebagai bagian dari hubungan ManyToMany, Anda dapat menentukan model pass-through yang dapat berisi bidang tambahan yang dapat digunakan untuk menyaring, menyortir, dll. Bidang yang didefinisikan seperti ini akan diekspos pada sisi sebaliknya dari kueri saat ini dalam model m2m.

Oleh karena itu, jika Anda menanyakan dari model A ke model B, hanya model B yang mengekspos bidang tembus. Yang masuk akal karena ini adalah model / bidang satu arah untuk setiap model terkait.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Kategori Kelas (ormar. Model):
    ormar _ config = ormar. OrmarConfig (
        Database = database,
        Metadata = metadata,
        Nama tabel = "kategori,"
    )

    Id = ormar. Integer (primary _ key = Benar)
    Nama = ormar. String (max _ length = 40)

# Anda dapat menentukan bidang tambahan melalui model
Kategori Pos Kelas (ormar. Model):
    ormar _ config = ormar. OrmarConfig (
        Database = database,
        Metadata = metadata,
        Tablename = "posting _ x _ kategori,"
    )

    Id: int = ormar. Integer (primary _ key = Benar)
    sort _ order: int = ormar. Integer (nullable = Benar)
    param _ name: str = ormar. String (default = "Name," max _ length = 200)


Pos Kelas (ormar. Model):
    ormar _ config = ormar. OrmarConfig (
        Database = database,
        Metadata = metadata,
    )

    Id: int = ormar. Integer (primary _ key = Benar)
    Judul: str = ormar. String (max _ length = 200)
    Kategori = ormar. ManyToMany (Kategori, through=PostCategory)

!!!Tip Untuk mempelajari lebih lanjut tentang banyak-ke-banyak hubungan dan bidang, kunjungi bagian banyak-ke-banyak

!!!Tip ManyToBanyak memungkinkan Anda untuk menanyakan model terkait menggunakan queryset-proxy.

1
Ini memungkinkan Anda untuk menggunakan `await post.categories.all()` tetapi juga `await category.posts.all()` untuk mengambil data yang hanya terkait dengan posting tertentu, kategori, dll.

Hubungan urutan default

Secara default, hubungan mengikuti urutan urutan urutan urutan model default, jadi kolom utama\ _ kunci berada dalam urutan menaik, atau ormar\ _ konfigurasi urutan jenis apa pun dalam objek.

!!! Tip Untuk mempelajari lebih lanjut tentang urutan pemilahan model, kunjungi bagian Model dokumentasi

Namun, Anda dapat mengubah urutan di mana model terkait dimuat selama kueri dengan menyediakan hubungan dengan pesanan\ _ berdasarkan dan\ _ pesanan\ _ terkait berdasarkan parameter.

Dalam suatu hubungan, Anda hanya dapat mengurutkan berdasarkan kolom model yang terkait langsung, atau untuk kolom banyak-ke-banyak, Anda juga dapat mengurutkan berdasarkan kolom model {through_field_name}__{column_name}

Konfigurasi contoh mungkin terlihat seperti ini:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Database = database. Database (DATABASE _ URL)
Metadata = sqlalchemy. MetaData ()


base _ ormar _ config = ormar. OrmarConfig (
    Database = database,
    Metadata = metadata,
)


Kelas Penulis (ormar. Model):
    ormar _ config = base _ ormar _ config copy ()

    Id: int = ormar. Integer (primary _ key = Benar)
    Nama: str = ormar. String (max _ length = 100)


Buku Kelas (ormar. Model):
    ormar _ config = base _ ormar _ config copy ()

    Id: int = ormar. Integer (primary _ key = Benar)
    Author: Opsional [Author] = ormar. ForeignKey (
        Penulis, order _ by = ["name"], terkait _ order _ by = ["-year"]
    )
    Judul: str = ormar. String (max _ length = 100)
    Tahun: int = ormar. Integer (nullable = Benar)
    Peringkat: int = ormar. Integer (nullable = Benar)

Hubungi sekarang:

await Author.objects.select_related("books").get() Buku akan diurutkan berdasarkan tahun buku dalam urutan menurun

await Book.objects.select_related("author").all() Penulis akan diurutkan berdasarkan nama penulis dalam urutan menaik

Referensi diri dan referensi yang ditangguhkan

Untuk membuat hubungan otomatis atau untuk membuat dua model yang merujuk satu sama lain dalam setidaknya dua hubungan yang berbeda (ingat bahwa kebalikannya terdaftar secara otomatis untuk Anda), Anda perlu menggunakan ForwardRef dalam modul input.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
Pribadi = TerdepanRef ("Orang")


Kelas Orang (ormar. Model):
    ormar _ config = base _ ormar _ config copy ()

    Id: int = ormar. Integer (primary _ key = Benar)
    Nama: str = ormar. String (max _ length = 100)
    Supervisor: PersonRef = ormar. ForeignKey (PersonRef, terkait _ name = "karyawan")


Pribadi. perbarui _ forward _ refs ()

!!! Tips Untuk mempelajari lebih lanjut tentang referensi diri dan hubungan yang ditangguhkan, kunjungi bagian komentar yang ditangguhkan