Saya ingin membuat objek yang berisi 2 tautan ke Pengguna. Sebagai contoh:
class GameClaim(models.Model):
target = models.ForeignKey(User)
claimer = models.ForeignKey(User)
isAccepted = models.BooleanField()
tapi saya mendapatkan kesalahan berikut saat menjalankan server:
Accessor untuk bentrokan 'target' bidang dengan bidang terkait 'User.gameclaim_set'. Tambahkan argumen terkait_name ke definisi untuk 'target'.
Accessor untuk bentrok 'penggugat' bidang dengan bidang terkait 'User.gameclaim_set'. Tambahkan argumen related_name ke definisi untuk 'penuntut'.
Bisakah Anda jelaskan mengapa saya mendapatkan kesalahan dan bagaimana cara memperbaikinya?
python
django
django-models
Oleg Tarasenko
sumber
sumber
related_name
dalam dokumentasi] ** ( docs.djangoproject.com/en/dev/ref/models/fields/#arguments ) akan menjelaskan mengapa itu terjadi.Jawaban:
Anda memiliki dua kunci asing untuk Pengguna. Django secara otomatis membuat relasi terbalik dari Pengguna kembali ke GameClaim, yang biasanya
gameclaim_set
. Namun, karena Anda memiliki dua FK, Anda akan memiliki duagameclaim_set
atribut, yang jelas tidak mungkin. Jadi, Anda perlu memberi tahu Django nama apa yang digunakan untuk relasi terbalik.Gunakan
related_name
atribut dalam definisi FK. misalnyasumber
The
User
model mencoba untuk membuat dua bidang dengan nama yang sama, satu untukGameClaims
yang memiliki yangUser
sebagaitarget
, dan satu lagi untukGameClaims
yang memiliki yangUser
sebagaiclaimer
. Inilah dokumen yangrelated_name
, yang merupakan cara Django untuk membiarkan Anda mengatur nama atribut sehingga yang di-autogenerasi tidak bertentangan.sumber
OP tidak menggunakan kelas dasar abstrak ... tetapi jika Anda melakukannya, Anda akan menemukan bahwa pengkodean sulit terkait_name di FK (misalnya ..., related_name = "myname") akan menghasilkan sejumlah kesalahan konflik ini - satu untuk setiap kelas warisan dari kelas dasar. Tautan yang disediakan di bawah ini berisi solusi, yang sederhana, tetapi jelas tidak jelas.
Dari django docs ...
Info lebih lanjut di sini .
sumber
Terkadang Anda harus menggunakan pemformatan tambahan di
related_name
- sebenarnya, kapan saja ketika pewarisan digunakan.Tidak ada bentrokan di sini, tetapi related_name didefinisikan sekali dan Django akan berhati-hati untuk membuat nama hubungan yang unik.
kemudian pada anak-anak kelas Value, Anda akan memiliki akses ke:
sumber
Saya sepertinya menemukan ini kadang-kadang ketika saya menambahkan submodule sebagai aplikasi untuk proyek Django, misalnya diberikan struktur berikut:
Jika saya menambahkan yang berikut ke INSTALLED_APPS:
Django tampaknya memproses file myapp.mymodule models.py dua kali dan melempar kesalahan di atas. Ini dapat diatasi dengan tidak menyertakan modul utama dalam daftar INSTALLED_APPS:
Termasuk
myapp
bukanmyapp.module
menyebabkan semua tabel database dibuat dengan nama yang salah, jadi ini sepertinya cara yang benar untuk melakukannya.Saya menemukan posting ini sambil mencari solusi untuk masalah ini jadi saya pikir saya akan menempatkan ini di sini :)
sumber
Hanya menambahkan jawaban Jordan (terima kasih untuk tip Jordan) itu juga dapat terjadi jika Anda mengimpor level di atas aplikasi dan kemudian mengimpor aplikasi mis.
myproject/ apps/ foo_app/ bar_app/
Jadi jika Anda mengimpor aplikasi, foo_app dan bar_app maka Anda bisa mendapatkan masalah ini. Saya punya aplikasi, foo_app dan bar_app semua tercantum dalam pengaturan.INSTALLED_APPS
Dan Anda ingin menghindari mengimpor aplikasi, karena Anda memiliki aplikasi yang sama terpasang di 2 ruang nama yang berbeda
apps.foo_app
danfoo_app
sumber