Saya mendefinisikan model Django saya sekarang dan saya menyadari bahwa tidak ada OneToManyField
dalam jenis bidang model. Saya yakin ada cara untuk melakukan ini, jadi saya tidak yakin apa yang saya lewatkan. Saya pada dasarnya memiliki sesuatu seperti ini:
class Dude(models.Model):
numbers = models.OneToManyField('PhoneNumber')
class PhoneNumber(models.Model):
number = models.CharField()
Dalam hal ini, masing Dude
- masing dapat memiliki beberapa PhoneNumber
s, tetapi hubungannya harus searah, karena saya tidak perlu tahu dari PhoneNumber
yang Dude
memilikinya, karena saya mungkin memiliki banyak objek berbeda yang memiliki PhoneNumber
instance, seperti Business
untuk contoh:
class Business(models.Model):
numbers = models.OneToManyField('PhoneNumber')
Apa yang akan saya ganti OneToManyField
(yang tidak ada) dengan model untuk mewakili hubungan semacam ini? Saya berasal dari Hibernate / JPA tempat mendeklarasikan hubungan satu-ke-banyak semudah:
@OneToMany
private List<PhoneNumber> phoneNumbers;
Bagaimana saya bisa mengekspresikan ini dalam Django?
sumber
dude = models.ForeignKey(Dude, related_name='numbers')
dan kemudian Anda dapat menggunakansome_dude_object.numbers.all()
untuk mendapatkan semua nomor terkait (jika Anda tidak menentukan "related_name" itu akan default ke "number_set").Di Django, hubungan satu-ke-banyak disebut ForeignKey. Namun, ini hanya bekerja dalam satu arah, daripada memiliki
number
atribut kelas yangDude
Anda perlukanBanyak model dapat memiliki satu
ForeignKey
ke model lain, sehingga akan valid untuk memiliki atribut keduaPhoneNumber
seperti ituAnda dapat mengakses
PhoneNumber
s untukDude
objekd
dengand.phonenumber_set.objects.all()
, dan kemudian melakukan hal yang sama untukBusiness
objek.sumber
ForeignKey
berarti "satu-ke-satu." Menggunakan contoh Anda di atas, saya harus memilikiDude
yang memiliki banyakPhoneNumbers
hak?ForeignKey
hanya satu-ke-satu jika Anda menentukanForeignKey(Dude, unique=True)
, jadi dengan kode di atas Anda akan mendapatkanDude
dengan beberapaPhoneNumber
s.PhoneNumber
. Sekarang mulai masuk akal.ForeignKey
pada dasarnya banyak-ke-satu, jadi Anda harus melakukannya mundur untuk mendapatkan satu-ke-banyak :)phonenumber_set
? Saya tidak melihatnya didefinisikan di mana pun. Apakah itu nama model, dalam semua huruf kecil, ditambahkan dengan "_set"?Untuk lebih jelas - tidak ada OneToMany di Django, hanya ManyToOne - yang dijelaskan Foreignkey di atas. Anda bisa mendeskripsikan relasi OneToMany menggunakan Foreignkey tapi itu sangat tidak ekspresif.
Artikel bagus tentang itu: https://amir.rachum.com/blog/2013/06/15/a-case-for-a-onetomany-relationship-in-django/
sumber
Anda dapat menggunakan kunci asing di banyak sisi
OneToMany
hubungan (yaituManyToOne
hubungan) atau menggunakanManyToMany
(di sisi mana pun) dengan batasan unik.sumber
django
cukup pintar. Sebenarnya kita tidak perlu mendefinisikanoneToMany
bidang. Ini akan secara otomatis dihasilkan olehdjango
untuk Anda :-). Kita hanya perlu mendefinisikanforeignKey
dalam tabel terkait. Dengan kata lain, kita hanya perlu mendefinisikanManyToOne
relasi dengan menggunakanforeignKey
.jika kita ingin mendapatkan daftar roda mobil tertentu. kita akan menggunakan
python's
objek yang dibuat secara otomatiswheel_set
. Untuk mobilc
Anda akan menggunakanc.wheel_set.all()
sumber
Sementara jawaban batu bergulir itu baik, langsung dan fungsional, saya pikir ada dua hal yang tidak dipecahkan.
Memperkenalkan kerangka jenis konten , yang memperlihatkan beberapa objek yang memungkinkan kita membuat "kunci asing generik" pada model PhoneNumber. Kemudian, kita dapat mendefinisikan hubungan terbalik pada Bung dan Bisnis
Lihat dokumen untuk detailnya, dan mungkin lihat artikel ini untuk tutorial cepat.
Juga, berikut adalah artikel yang menentang penggunaan FK Generik.
sumber
Jika model "banyak" tidak membenarkan pembuatan model per-se (tidak terjadi di sini, tetapi mungkin menguntungkan orang lain), alternatif lain akan bergantung pada tipe data PostgreSQL tertentu, melalui paket Django Contrib
Postgres dapat menangani tipe data Array atau JSON , dan ini mungkin merupakan solusi yang bagus untuk menangani One-To-Many ketika banyak- hanya dapat diikat ke satu entitas dari satu .
Postgres memungkinkan Anda untuk mengakses elemen tunggal dari array, yang berarti bahwa kueri bisa sangat cepat, dan menghindari overhead tingkat aplikasi. Dan tentu saja, Django mengimplementasikan API keren untuk meningkatkan fitur ini.
Ini jelas memiliki kelemahan karena tidak portabel untuk backend database orang lain, tapi saya pikir itu masih layak disebut.
Semoga ini bisa membantu beberapa orang mencari ide.
sumber
Pertama-tama, kami melakukan tur:
01) hubungan satu-ke-banyak:
NB: Django tidak menyediakan hubungan OneToMany. Jadi kita tidak bisa menggunakan metode teratas di Django. Tetapi kita perlu mengkonversi dalam model relasional. Jadi apa yang bisa kita lakukan? Dalam situasi ini kita perlu mengubah model relasional menjadi model relasional terbalik.
Sini:
model relasional = OneToMany
Jadi, balikkan model relasional = ManyToOne
NB: Django mendukung hubungan ManyToOne & di Django ManyToOne diwakili oleh ForeignKey.
02) hubungan banyak-ke-satu:
NB: PIKIR SIMPLY !!
sumber