Khóa ngoại từ ứng dụng này sang ứng dụng khác trong Django


99

Tôi tự hỏi liệu có thể xác định khóa ngoại trong tệp models.py trong Django tham chiếu đến bảng trong ứng dụng khác không?

Nói cách khác, tôi có hai ứng dụng, được gọi là cf và hồ sơ, và trong cf / models.py tôi có (trong số những thứ khác):

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

và trong hồ sơ / models.py tôi muốn có:

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

Nhưng tôi không thể làm cho nó hoạt động. Tôi đã thử:

    movie = models.ForeignKey(cf.Movie)

và tôi đã thử nhập cf.Movie ở đầu models.py, nhưng tôi luôn gặp lỗi, chẳng hạn như:

NameError: name 'User' is not defined

Tôi có đang vi phạm các quy tắc bằng cách cố gắng liên kết hai ứng dụng lại với nhau theo cách này hay tôi chỉ sai cú pháp?

Câu trả lời:


153

Theo tài liệu, nỗ lực thứ hai của bạn sẽ hoạt động:

Để tham chiếu đến các mô hình được xác định trong một ứng dụng khác, thay vào đó bạn phải chỉ định rõ ràng nhãn ứng dụng. Ví dụ: nếu mô hình Nhà sản xuất ở trên được xác định trong một ứng dụng khác được gọi là sản xuất, bạn cần sử dụng:

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

Bạn đã thử đặt nó vào dấu ngoặc kép chưa?


1
Tài liệu liên quan có thể tìm thấy ở đây
Nathan Jones

Có được không khi có khóa ngoại trên nhiều ứng dụng? tôi đang thực hiện một dự án có nhiều ứng dụng với nhiều khóa ngoại trên nhiều ứng dụng trong một dự án. fyi, tôi đã bắt đầu câu hỏi nhưng đang chờ câu trả lời. stackoverflow.com/questions/55213918/…
Tian Loon

Tôi biết muộn, nhưng chủ yếu là vấn đề lựa chọn và tổ chức. Tôi có các ứng dụng "nội bộ" không bao giờ dành cho mục đích sử dụng bên ngoài. Chúng có thể phụ thuộc vào nhau và tồn tại chủ yếu để cung cấp cho tôi một tổ chức thuận tiện cho các tệp và không gian tên của tôi. Các ứng dụng bên ngoài (ví dụ như từ DjangoPackages) và các ứng dụng mà một ngày nào đó tôi có thể sẽ đóng góp cho công chúng, cần được giữ miễn phí càng nhiều càng tốt vì các ứng dụng phụ thuộc đó (mặc dù sự phụ thuộc vào một số ứng dụng miền công cộng được hỗ trợ tốt khác có thể không sao. Rất nhiều các ứng dụng công khai liên quan đến người dùng phụ thuộc vào người dùng / nhóm / mô hình quyền của Django).
nigel222

24

Nó cũng có thể vượt qua chính lớp:

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

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

9

OK - Tôi đã tìm ra. Bạn có thể làm điều đó, bạn chỉ cần sử dụng đúng importcú pháp. Cú pháp đúng là:

from prototype.cf.models import Movie

Sai lầm của tôi là không chỉ rõ .modelsphần của dòng đó. Ôi!


11
Đôi khi bạn phải sử dụng dấu ngoặc kép chứ không phải nhập, vì bạn có thể nhận được các tệp nhập lẫn nhau.
Sam Stoelinga
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.