คีย์ต่างประเทศจากแอปหนึ่งไปยังอีกแอปหนึ่งใน Django


101

ฉันสงสัยว่าเป็นไปได้ไหมที่จะกำหนด Foreign Key ในไฟล์ models.py ใน Django ที่อ้างอิงถึงตารางในแอปอื่น

กล่าวอีกนัยหนึ่งฉันมีสองแอพชื่อ cf และ profiles และใน cf / models.py ฉันมี (เหนือสิ่งอื่นใด):

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

และในโปรไฟล์ / model.py ฉันต้องการมี:

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

แต่ฉันไม่สามารถทำให้มันทำงานได้ ฉันได้ลองแล้ว:

    movie = models.ForeignKey(cf.Movie)

และฉันได้ลองนำเข้า cf.Movie ที่จุดเริ่มต้นของ models.py แต่ฉันมักจะได้รับข้อผิดพลาดเช่น:

NameError: name 'User' is not defined

ฉันทำผิดกฎโดยพยายามผูกสองแอพเข้าด้วยกันด้วยวิธีนี้หรือว่าฉันมีไวยากรณ์ผิด?

คำตอบ:


157

ตามเอกสารความพยายามครั้งที่สองของคุณควรได้ผล:

หากต้องการอ้างถึงโมเดลที่กำหนดในแอปพลิเคชันอื่นคุณต้องระบุป้ายกำกับแอปพลิเคชันอย่างชัดเจนแทน ตัวอย่างเช่นหากมีการกำหนดรูปแบบผู้ผลิตข้างต้นในแอปพลิเคชันอื่นที่เรียกว่าการผลิตคุณจะต้องใช้:

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

คุณลองใส่ลงในเครื่องหมายคำพูดแล้วหรือยัง?


1
สามารถดูเอกสารที่เกี่ยวข้องได้ที่นี่
Nathan Jones

การมีคีย์ต่างประเทศในหลาย ๆ แอปสามารถทำได้หรือไม่? ฉันกำลังทำโปรเจ็กต์ที่มีแอพจำนวนมากที่มีคีย์ต่างประเทศจำนวนมากในหลาย ๆ แอพภายในโปรเจ็กต์ fyi ฉันได้เริ่มคำถามแล้ว แต่กำลังรอคำตอบ stackoverflow.com/questions/55213918/…
Tian Loon

ช้าฉันรู้ แต่ส่วนใหญ่เป็นเรื่องของทางเลือกและองค์กร ฉันมีแอป "ภายใน" ที่ไม่เคยมีไว้สำหรับใช้ภายนอก พวกเขาสามารถพึ่งพาซึ่งกันและกันและมีอยู่เป็นหลักเพื่อให้ฉันสามารถจัดระเบียบไฟล์และเนมสเปซของฉันได้สะดวก แอพภายนอก (เช่นจาก DjangoPackages) และแอพที่วันหนึ่งฉันอาจมีส่วนร่วมกับสาธารณะจำเป็นต้องเก็บไว้ให้เป็นอิสระตามการอ้างอิงดังกล่าวให้มากที่สุด (แม้ว่าการพึ่งพาแอพโดเมนสาธารณะอื่น ๆ ที่รองรับอย่างดีอาจจะโอเคมากก็ตาม แอปที่เกี่ยวข้องกับผู้ใช้สาธารณะขึ้นอยู่กับรูปแบบผู้ใช้ / กลุ่ม / สิทธิ์ของ Django)
nigel222

ขอบคุณสิ่งนี้ใช้ได้ผลสำหรับฉัน การเพิ่มคำพูดเราไม่จำเป็นต้องนำเข้าคลาส แต่ฉันสงสัยว่าจะมีความแตกต่างหรือไม่หากเราตัดสินใจนำเข้าคลาสเช่นตัวอย่างที่ดีอื่น ๆ ที่ให้โดย @andorov?
Michel Mesquita

27

นอกจากนี้ยังสามารถผ่านชั้นเรียนได้ด้วยตัวเอง:

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

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

10

ตกลง - ฉันคิดออกแล้ว คุณสามารถทำได้คุณต้องใช้importไวยากรณ์ที่ถูกต้อง ไวยากรณ์ที่ถูกต้องคือ:

from prototype.cf.models import Movie

ความผิดพลาดของฉันคือไม่ได้ระบุ.modelsส่วนของบรรทัดนั้น โธ่!


11
บางครั้งคุณต้องใช้เครื่องหมายคำพูดไม่ใช่การนำเข้าเนื่องจากคุณอาจได้รับไฟล์ที่นำเข้าซึ่งกันและกัน
Sam Stoelinga
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.