2015-07-09 13 views
6

Tôi phát triển một ứng dụng nhất định mà tôi đã tìm thấy với lược đồ mô hình và cơ sở dữ liệu được chỉ định. Tôi đang sử dụng phiên bản Django 1.8.2. Dưới đây là một vấn đề. Các trường không cần thiết đã được bỏ qua, tên mô hình được phát minh cho các mục đích của một ví dụ, bởi vì tôi không thể tiết lộ. Hãy xem xét các mô hình sau đây A và B.Cách tạo khóa chính bao gồm hai trường trong Django?

class B (models.Model): 

     name = models.CharField(max_length=100) 

class A (models.Model): 

     name = models.CharField(max_length=100, primary_key=True) 
     related_name = models.ForeignKey(B, null=True, blank=True) 

Sau một thời gian dài, dự án có thể có cùng tên A, nhưng với khóa ngoại khác nhau B. Trong trường hợp cụ thể này, tôi muốn mô hình khóa chính "A" bao gồm hai trường: tên và tên liên quan. Làm thế nào để tạo ra một chìa khóa bao gồm hai lĩnh vực trong django?

+0

Có thể thay đổi khóa chính của 'A' thành mặc định django' id' thay thế không? Điều đó có vẻ như sự sửa chữa rõ ràng. –

+0

Xin chào :-) Cảm ơn bạn đã trả lời. Đây là một giải pháp tốt, nhưng trong trường hợp của tôi nhiều bảng có bàn phím ngoài là "A" và thay đổi thành id mặc định sẽ là một nỗ lực thực sự lớn. Hơn nữa, rất nhiều mã bằng cách sử dụng các truy vấn như 'A.objects.get (pk = "something")' và thay đổi loại khóa chính đòi hỏi rất nhiều công việc. Vì lý do này, tôi đang tìm một giải pháp không thay đổi loại khóa. Các cơ sở có rất nhiều năm. –

+0

Ok. Trong trường hợp đó tôi không nghĩ rằng điều này có thể được giải quyết trong django. Django yêu cầu một khóa chính duy nhất cho mỗi cá thể. Ngay cả khi bạn có thể sử dụng một khóa chính composite, tôi không chắc chắn nếu nó là một ý tưởng tốt khi một trong các lĩnh vực trong pk là một khóa ngoại nullable. –

Trả lời

3

Bạn muốn sử dụng khóa tổng hợp. Django không hỗ trợ điều này See here. Có một số hỗ trợ nhưng bạn không thể có mối quan hệ vì vậy nó khá hạn chế như xa như sử dụng thực tế.

Currently Django models only support a single column in this set, denying many designs where the natural primary key of a table is multiple columns. Django currently can't work with these schemas; they must instead introduce a redundant single-column key (a “surrogate” key), forcing applications to make arbitrary and otherwise-unnecessary choices about which key to use for the table in any given instance.

2

Django không hỗ trợ phím tổng hợp. Nhưng bạn có thể sử dụng unique-together

unique_together = ("name", "related_name") 
+0

Khi tôi sẽ sử dụng unique_together, giả định rằng các mô hình sẽ trông như được trình bày trong câu hỏi. Sau khi thêm mô hình meta-class A unique_together = ("name", "related_name"), tôi có thể có hai dòng name = "Kriss" tên liên quan đến trường khác nhau? Ý tôi là thông số field_key của trường name được đặt thành true. –

+0

>>> s = B.objects.create (name = "JAN") >>> s.save() >>> d = A.objects.create (name = "Stasze") >>> d .save() >>> k = A.objects.create (name = "Stasze", related_name = s) trả về Database.Cursor.execute (tự, truy vấn, params) django.db.utils.IntegrityError: UNIQUE ràng buộc không thành công: test_comp_a.name –

+0

* Nó không phải là một PK hỗn hợp *, hãy nhớ điều đó. Bạn đang sử dụng thuộc tính 'name' trong lớp' A' là PK và tạo đối tượng lặp lại. Nếu bạn sẽ có cùng 'tên' trong nhiều đối tượng' A', không sử dụng nó làm PK, sử dụng 'autoincrement' làm mặc định và' unique_together' sẽ thực hiện thủ thuật. – Gocht

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