2009-05-28 25 views
5

Tôi đang cố tạo bảng ánh xạ giữa hai tham chiếu chung (content_type), một cho "tác nhân" và một cho "tài nguyên".mô hình django với hai khóa ngoại lệ chung (content_type)?

Vì vậy, tôi đi theo cách thông thường tôi thực hiện một khóa ngoại generic:

content_type = models.ForeignKey(ContentType) 
object_id = models.PositiveIntegerField() 
resource = generic.GenericForeignKey('content_type', 'object_id') 

Và tôi cố gắng để tạo ra một mô hình với hai.

agent_content_type = models.ForeignKey(ContentType) 
agent_object_id = models.PositiveIntegerField() 
agent = generic.GenericForeignKey('agent_content_type', 'agent_object_id') 

resource_content_type = models.ForeignKey(ContentType) 
resource_object_id = models.PositiveIntegerField() 
resource = generic.GenericForeignKey('resource_content_type', 'resource_object_id') 

Nhưng điều này bây giờ ném lên các lỗi sau đây:

myapp.mymodel: accessor cho lĩnh vực 'resource_content_type' đụng độ với lĩnh vực liên quan 'ContentType.mymodel_set'. Thêm đối số related_name vào định nghĩa cho 'resource_content_type'.

Và tương tự cho tác nhân.

Điều gì đang xảy ra ở đây? Và tôi nên làm gì?

cổ vũ

phil

Trả lời

10

bạn đã cố gắng làm những gì được thông báo lỗi cho bạn biết phải làm gì - thêm một đối số related_name?

agent_content_type = models.ForeignKey(ContentType, related_name='mymodel_agent') 

Edit: Lý do tại sao nó xảy ra là mỗi khi bạn định nghĩa một chính nước ngoài, Django tự động cung cấp cho các mô hình mục tiêu một thuộc tính để làm đảo ngược tra cứu. Theo mặc định, tên này cung cấp cho tên của bảng có liên quan + - vì vậy nếu bảng article của bạn có FK đến section, section sẽ nhận được thuộc tính article_set để tra cứu ngược lại.

Bây giờ nếu bạn có hai FK trong cùng một mô hình trỏ vào cùng một mô hình đích, Django sẽ thử và cung cấp cho chúng thuộc tính , dẫn đến va chạm. Do đó thông báo lỗi, thông báo cho bạn biết đặt thuộc tính related_name theo cách thủ công.

+0

cảm ơn, hoạt động. Nhưng tôi đã hy vọng ai đó có thể giải thích tại sao. Hay đúng hơn, tại sao sự mơ hồ xuất hiện khi tôi có hai khóa chung chung nhưng không phải là một? – interstar

+0

Đã chỉnh sửa để thêm giải thích. –

Các vấn đề liên quan