2013-06-28 26 views
5

Tôi có hai lớp trong tập tin models.py tôi:Làm thế nào để loại bỏ trường ID dư thừa trong bảng ManyToMany được tạo tự động trong Django?

class Person: 
    person_name = models.CharField(max_length = 50) 

class Course: 
    course_name = models.CharField(max_length = 50) 
    course_person = models.ManyToManyField(Person) 

Trong ví dụ sửa đổi của tôi, một người là mất nhiều khóa học và một khóa học được thực hiện bởi nhiều người, vì thế ManyToMany.

Khi tôi cho phép Django tự động tạo bảng của tôi, tôi nhận thêm trường ID. Tôi muốn tự động phát hiện bảng số nhiều là person_course để bao gồm hai phím tổng hợp person_id và chỉ course_id. Lưu ý: Cả hai trường đều được tạo tự động, các trường được tăng tự động.

Tôi cũng đã thử xác định lớp ManyToMany của mình và cố gắng liên kết các trường bằng cách sử dụng từ khóa through=, nhưng điều đó không giúp ích gì.

Tôi đã yêu cầu Google nhưng không có nhiều trợ giúp. Nhiều số thiên tài trong bạn có thể cung cấp một số gợi ý :)

Trả lời

6

Django hiện does not support composite primary key by default

gì bạn có thể làm thay vào đó là giữ cho tự động tạo id như (thay thế) khóa chính và sau đó xác định một mối quan hệ unique_together trong bảng through .

class Meta: 
    unique_together = (course, person) 

Bằng cách này, bạn có thể đảm bảo mục duy nhất trong bảng thông qua, và khi bạn tham khảo các id nó là tương đương với việc tham khảo độc đáo (course, person) đó là những gì chúng tôi muốn anyways.

Có một số third party apps triển khai tính năng này nếu bạn muốn. Tuy nhiên, trừ khi cần thiết tuyệt đối (như hỗ trợ hệ thống cũ), tôi chỉ đơn giản là giữ nó đơn giản và thực hiện unique_together.

+2

Cảm ơn bạn đã nhập. Vâng, đó là một hạn chế từ Django không để có thể làm điều đó. Django cố gắng làm cho cuộc sống dễ dàng. Tôi sử dụng để thiết kế cơ sở dữ liệu từ đầu để sử dụng trong các ứng dụng của tôi và tôi không hạnh phúc như vậy mà Django cố gắng làm tất cả mọi thứ riêng của mình. Ít nhất, tôi không có nhiều điều khiển trên những thứ _some_, như không tạo ra trường ID dự phòng. Tôi sử dụng MySQL bàn làm việc để mô tả trực quan cơ sở dữ liệu của tôi, và trường ID bổ sung này không có vẻ tốt. Dù sao, vì nó không ảnh hưởng đến logic ứng dụng, tôi có thể sống với điều đó :) – shailenTJ