2010-06-22 3 views
6

Tôi có một cơ sở dữ liệu kế thừa với một bảng lưu trữ mối quan hệ nhiều-nhiều, nhưng không có một cột khóa chính. Có cách nào để thuyết phục Django sử dụng nó không?Django: Nhiều-nhiều thông qua một bảng với (chỉ) phím ghép

sơ đồ:

Product 1<---->* Labeling *<---->1 Label 

Bảng Labeling sử dụng (product_id,label_id) như một khóa chính hợp chất, và tôi không thấy bất cứ cách nào để thông báo cho Django về việc này. (Chỉ cần sử dụng through cho tôi Unknown column 'labeling.id' in 'field list'.)

Tôi có cần phải quay trở lại SQL tùy chỉnh không? Hay tôi đang thiếu một cái gì đó?

Trả lời

1

Nếu bạn thêm một unique_together với mô hình cho bảng nhiều-nhiều, Django sẽ sử dụng các cột thay vì chờ đợi một chính được gọi là id.

+0

Không thực sự, nó cũng sẽ tạo trường 'id'. Có một [giải pháp thay thế] (https://stackoverflow.com/a/28712960/52499). Nhưng thực tế trong trường hợp của tôi, tôi quyết định đi với trường 'id'. Không có bảng cũ. –

1
+0

Tôi đã không mong đợi nó sẽ ... nhưng nó đã làm: 'unique_together' là tất cả những gì cần thiết để ngăn chặn Django yêu cầu cho một cột khóa chính. Nếu bạn thêm (hoặc từ đó vào hiệu ứng đó) vào câu trả lời của bạn, tôi có thể chấp nhận nó. (Afaik 'db_index' không liên quan: nó chỉ áp dụng cho các trường riêng lẻ.) – Tikitu

+0

Trong khi đúng là Django không phàn nàn nữa nếu bạn thêm unique_together * nhưng * nó vẫn chưa đầy đủ chức năng. Ví dụ xóa (Model.Delete()) trên mô hình được chỉ định trong các tham số thông qua sẽ ngoại trừ. Tôi là chuyên gia đủ để dám cho điều này như là một câu trả lời, cho những gì tôi đọc Django không hỗ trợ không có một khóa chính trên một mô hình. – Boaz

+0

@Tikitu Cảm ơn bạn, cảm ơn bạn, cảm ơn bạn! Tôi đã rách tóc ra cố gắng tìm cách để làm cho Django không yêu cầu cột 'primary_key = True' cho cơ sở dữ liệu chỉ đọc cũ của tôi với nhiều bảng trung gian nhiều đến nhiều. Tôi biết về 'unique_together', nhưng tôi đã không nhận ra nó sẽ làm cho sự nhấn mạnh của Django khi' primary_key = True' biến mất. Bây giờ, Django 1.8 thực sự đưa ra cảnh báo về việc thiết lập 'primary_key = True' trên trường ForeignKey, điều này đột nhiên trở nên rất quan trọng. – CoreDumpError