Django'da bir uygulamadan diğerine yabancı anahtar


102

Django'daki bir models.py dosyasında başka bir uygulamadaki bir tabloya referans olan bir yabancı anahtar tanımlamanın mümkün olup olmadığını merak ediyorum.

Diğer bir deyişle, cf ve profiles adında iki uygulamam var ve cf / models.py içinde (diğer şeylerin yanı sıra):

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

ve profiles / models.py içinde sahip olmak istiyorum:

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

Ama işe alamıyorum. Denedim:

    movie = models.ForeignKey(cf.Movie)

ve models.py'nin başında cf.Movie'yi içe aktarmayı denedim, ancak her zaman aşağıdaki gibi hatalar alıyorum:

NameError: name 'User' is not defined

İki uygulamayı bu şekilde birbirine bağlamaya çalışarak kuralları mı çiğniyorum yoksa sözdizimini yanlış mı anladım?

Yanıtlar:


158

Dokümanlara göre, ikinci denemeniz işe yaramalı:

Başka bir uygulamada tanımlanan modellere başvurmak için, bunun yerine uygulama etiketini açıkça belirtmeniz gerekir. Örneğin, yukarıdaki Üretici modeli üretim adı verilen başka bir uygulamada tanımlanmışsa, şunları kullanmanız gerekir:

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

Alıntılara eklemeyi denediniz mi?


1
İlgili belgeler burada
Nathan Jones

Birçok uygulamada yabancı anahtarların olması uygun mudur? Bir proje içindeki birçok uygulamada birçok yabancı anahtar içeren birçok uygulamaya sahip bir proje yapıyorum. fyi, soruya çoktan başladım ama cevapları bekliyorum. stackoverflow.com/questions/55213918/…
Tian Loon

Geç biliyorum ama bu çoğunlukla bir seçim ve organizasyon meselesi. Hiçbir zaman harici kullanım için tasarlanmamış "dahili" uygulamalarım var. Birbirlerine güvenebilirler ve esas olarak dosyalarımın ve ad alanlarımın uygun bir organizasyonunu sağlamak için var olabilirler. Bir gün halka katkıda bulunabileceğim harici uygulamalar (örneğin, DjangoPackages'dan) ve uygulamaların mümkün olduğunca bu tür bağımlılıklar kadar ücretsiz tutulması gerekir (ancak iyi desteklenen diğer bazı kamuya açık uygulamalarına bağımlılık sorun olmayabilir. genel kullanıcıyla ilgili uygulamalar, Django'nun kullanıcı / grup / izin modellerine bağlıdır).
nigel222

Teşekkürler, bu benim için çalıştı. Tırnak ekleyerek sınıfı içe aktarmamıza gerek kalmaz. Ancak, @andorov tarafından verilen diğer güzel örnek gibi, sınıfı içe aktarmaya karar verirsek, herhangi bir farklılık olup olmadığını merak ediyorum.
Michel Mesquita

27

Sınıfın kendisini geçmek de mümkündür:

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

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

10

Tamam - anladım. Yapabilirsiniz, sadece doğru importsözdizimini kullanmanız gerekir . Doğru sözdizimi şöyledir:

from prototype.cf.models import Movie

Benim hatam, .modelsbu satırın bir kısmını belirtmek değildi . D'oh!


11
Bazen içe aktarım yerine tırnak işareti kullanmanız gerekir, çünkü dosyalar birbirini içe aktarabilir.
Sam Stoelinga 01
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.