Apa related_name
argumen yang berguna untuk bidang ManyToManyField
dan ForeignKey
bidang? Misalnya, mengingat kode berikut, apa efeknya related_name='maps'
?
class Map(db.Model):
members = models.ManyToManyField(User, related_name='maps',
verbose_name=_('members'))
related_name
jadi jika Anda tahu Anda tidak akan menggunakannya, saya kira itu hal yang baik. Itu pendapat pribadi tentunya.+
berarti tidak membuat hubungan terbalikJawaban:
The
related_name
atribut menentukan nama hubungan terbalik dariUser
model yang kembali ke model Anda.Jika Anda tidak menentukan
related_name
, Django secara otomatis membuat satu menggunakan nama model Anda dengan suffix_set
, misalnyaUser.map_set.all()
.Jika Anda tidak menentukan, misalnya
related_name=maps
padaUser
modelUser.map_set
akan tetap bekerja, tetapiUser.maps.
sintaks jelas sedikit lebih bersih dan kurang kikuk; jadi misalnya, jika Anda memiliki objek penggunacurrent_user
, Anda bisa menggunakancurrent_user.maps.all()
untuk mendapatkan semua instance dariMap
model Anda yang memiliki hubungan dengancurrent_user
.The dokumentasi Django memiliki rincian lebih lanjut.
sumber
related_name='maps+'
pada contoh di atas?related_name
, apakah_set
masih berfungsidjango1.11 >
??related_name
ditentukan,_set
tidak berfungsi lagi.Untuk menambah nama terkait jawaban yang ada adalah suatu keharusan jika ada 2 FK dalam model yang menunjuk ke tabel yang sama. Misalnya dalam hal Bill of material
Jadi ketika Anda harus mengakses data ini, Anda hanya dapat menggunakan nama terkait
Itu tidak berfungsi sebaliknya (setidaknya saya tidak bisa melewati penggunaan nama terkait dalam kasus 2 FK ke tabel yang sama.)
sumber
related_name
harus jamak. Karena hubungan ForeignKey mengembalikan beberapa objek.The
related_name
Argumen ini juga berguna jika Anda memiliki nama kelas terkait yang lebih kompleks. Misalnya, jika Anda memiliki hubungan kunci asing:Untuk mengakses
UserMapDataFrame
objek dari yang terkaitUser
, panggilan defaultnya adalahUser.usermapdataframe_set.all()
, yang cukup sulit dibaca.Menggunakan
related_name
memungkinkan Anda untuk menentukan nama yang lebih sederhana atau lebih mudah dibaca untuk mendapatkan hubungan terbalik. Dalam hal ini, jika Anda menentukanuser = models.ForeignKey(User, related_name='map_data')
, panggilan itu akan menjadiUser.map_data.all()
.sumber
Parameter nama terkait sebenarnya merupakan opsi. Jika kita tidak mengaturnya, Django secara otomatis membuat sisi lain dari relasi untuk kita. Dalam kasus model Peta, Django akan membuat
map_set
atribut, yang memungkinkan akses melaluim.map_set
dalam contoh Anda (m menjadi instance kelas Anda). Rumus yang digunakan Django adalah nama model yang diikuti oleh string_set
. Parameter nama terkait dengan demikian hanya menimpa standar Django daripada memberikan perilaku baru.sumber
prefetch_related
gunakan untuk data prefetch untuk Many to many dan many to one relationship data.select_related
adalah memilih data dari hubungan nilai tunggal. Keduanya digunakan untuk mengambil data dari hubungan mereka dari suatu model. Misalnya, Anda membangun model dan model yang memiliki hubungan dengan model lain. Ketika permintaan datang, Anda juga akan meminta data hubungan mereka dan Django memiliki mekanisme yang sangat baik Untuk mengakses data dari hubungan mereka sepertibook.author.name
tetapi ketika Anda mengulang daftar model untuk mengambil data hubungan mereka, Django membuat setiap permintaan untuk setiap data hubungan tunggal. Untuk mengatasi ini kita memang punyaprefetchd_related
danselected_related
sumber