Kunci asing dari satu aplikasi ke aplikasi lainnya di Django


101

Saya bertanya-tanya apakah mungkin untuk mendefinisikan kunci asing dalam file models.py di Django yang merupakan referensi ke tabel di aplikasi lain?

Dengan kata lain, saya memiliki dua aplikasi, yang disebut cf dan profil, dan di cf / models.py saya punya (antara lain):

class Movie(models.Model):
    title = models.CharField(max_length=255)

dan di profiles / models.py Saya ingin memiliki:

class MovieProperty(models.Model):
    movie = models.ForeignKey(Movie)

Tapi saya tidak bisa membuatnya bekerja. Saya sudah mencoba:

    movie = models.ForeignKey(cf.Movie)

dan saya sudah mencoba mengimpor cf.Movie di awal models.py, tapi saya selalu mendapatkan kesalahan, seperti:

NameError: name 'User' is not defined

Apakah saya melanggar aturan dengan mencoba menyatukan dua aplikasi dengan cara ini, atau apakah sintaks saya salah?

Jawaban:


157

Menurut dokumen, upaya kedua Anda seharusnya berhasil:

Untuk merujuk ke model yang ditentukan dalam aplikasi lain, Anda harus menentukan label aplikasi secara eksplisit. Misalnya, jika model Pabrikan di atas ditentukan dalam aplikasi lain yang disebut produksi, Anda perlu menggunakan:

class Car(models.Model):
    manufacturer = models.ForeignKey('production.Manufacturer')

Sudahkah Anda mencoba memasukkannya ke dalam tanda kutip?


1
Dokumen yang relevan dapat ditemukan di sini
Nathan Jones

Bolehkah memiliki kunci asing di banyak aplikasi? Saya melakukan proyek yang memiliki banyak aplikasi dengan banyak kunci asing di banyak aplikasi dalam sebuah proyek. fyi, saya sudah memulai pertanyaan tetapi menunggu jawaban. stackoverflow.com/questions/55213918/…
Tian Loon

Terlambat, aku tahu, tapi yang terpenting adalah pilihan dan organisasi. Saya memiliki aplikasi "internal" yang tidak pernah dimaksudkan untuk penggunaan eksternal. Mereka dapat bergantung satu sama lain dan ada terutama untuk memberi saya pengaturan yang nyaman dari file dan namespace saya. Aplikasi eksternal (misalnya dari DjangoPackages) dan aplikasi yang suatu hari nanti mungkin saya kontribusikan kepada publik, perlu disimpan sebebas mungkin ketergantungan (walaupun ketergantungan pada beberapa aplikasi domain publik lain yang didukung dengan baik mungkin baik-baik saja. Banyak aplikasi terkait pengguna publik bergantung pada model pengguna / grup / izin Django).
nigel222

Terima kasih, ini berhasil untuk saya. Dengan menambahkan tanda kutip, kita tidak perlu mengimpor kelas. Tapi saya ingin tahu apakah ada perbedaan jika kami memutuskan untuk mengimpor kelas, seperti contoh bagus lainnya yang diberikan oleh @andorov?
Michel Mesquita

27

Dimungkinkan juga untuk melewati kelas itu sendiri:

from django.db import models
from production import models as production_models

class Car(models.Model):
    manufacturer = models.ForeignKey(production_models.Manufacturer)

10

OK - Saya sudah menemukan jawabannya. Anda bisa melakukannya, Anda hanya perlu menggunakan importsintaks yang benar . Sintaks yang benar adalah:

from prototype.cf.models import Movie

Kesalahan saya tidak menyebutkan .modelsbagian dari baris itu. D'oh!


11
Terkadang Anda harus menggunakan tanda kutip dan bukan impor, karena Anda mungkin mendapatkan file yang saling mengimpor.
Sam Stoelinga
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.