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?

Ben
sumber

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?

Michael Warkentin
sumber
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)
andorov
sumber
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!

Ben
sumber
11
Terkadang Anda harus menggunakan tanda kutip dan bukan impor, karena Anda mungkin mendapatkan file yang saling mengimpor.
Sam Stoelinga