2015-03-01 23 views
6

Cho phép nói rằng tôi có những mô hình cơ sở này:Django mô hình đa hình với unique_together

class Trackable(PolymorphicModel): 
    uuid = UUIDField(unique=True) 
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL) 
    created_at = models.DateTimeField(auto_now_add=True) 
    updated_at = models.DateTimeField(auto_now=True) 

Và một mô hình con mở rộng nó:

class Like(Trackable): 
    content = models.ForeignKey(Content, related_name='likes') 

    class Meta: 
     unique_together = ['content', 'created_by'] 

Khi tôi chạy di cư, nó than phiền về:

django.db.models.fields.FieldDoesNotExist: Like has no field named u'created_by' 
+0

Bạn có muốn 'Trackable' là bảng riêng của mình, liên quan đến' Like' bằng khóa ngoại không? Nếu không, sử dụng ['abstract = True'] (https://docs.djangoproject.com/en/dev/topics/db/models/#abstract-base-classes) và' unique_together' của bạn sẽ hoạt động như mong đợi. Nếu vậy, bạn sẽ không thể thực thi ràng buộc đó với 'unique_together'. –

+0

Tôi không chắc chắn nếu thêm rằng sẽ làm việc đúng cách bằng cách sử dụng https://github.com/chrisglass/django_polymorphic vì tôi không nhìn thấy nó đề cập về việc sử dụng abstract = True trong mô hình cơ sở. –

+0

Tôi liếc nhìn dự án đó và có vẻ như nó được thiết kế để thừa kế 'abstract = False'. Trong trường hợp này bạn đang nói về hai bảng khác nhau, làm cho nó không thể sử dụng 'unique_together' theo cách đó. Lưu ý rằng 'abstract = True' sẽ cung cấp hiệu suất tốt hơn và cho phép ràng buộc duy nhất, vì vậy hãy nghĩ xem liệu bạn có thực sự cần sử dụng nhiều bảng hay không. –

Trả lời

2

Đây là cách tôi xử lý sự cố này. Ghi nhớ rằng tôi sử dụng PostGres làm cơ sở dữ liệu của tôi và tôi không biết nếu cùng một vấn đề xảy ra với cơ sở dữ liệu khác (mặc dù tôi đoán rằng họ làm).

Ràng buộc duy nhất cùng nhau chỉ có thể được áp dụng cho một bảng hoặc chế độ xem trong PostGres. Điều này có nghĩa là ra khỏi hộp Django/Django-đa hình không thể thể hiện các ràng buộc duy nhất được cơ sở dữ liệu thực thi trên sự kết hợp của các trường trong cả bảng cha và bảng con của mô hình Django trong hệ thống phân cấp thừa kế.

Nếu bạn thực sự muốn cơ sở dữ liệu thực thi ràng buộc duy nhất trên các lĩnh vực này, bạn có thể làm một trong hai điều này:

  1. sao chép bất kỳ lĩnh vực giữa phụ huynh và mô hình có liên quan đến những hạn chế duy nhất vào bảng của đứa trẻ, và thể hiện ràng buộc duy nhất trên các trường của con và các trường được sao chép từ bố mẹ hoặc
  2. tạo chế độ xem trên con bao gồm cả trường từ cha mẹ và các trường con và thể hiện ràng buộc duy nhất trên chế độ xem này.

Bạn sẽ phải thực hiện việc này theo cách thủ công hoặc phát triển khung của riêng bạn để chèn/thay đổi/xóa các ràng buộc này một cách tự động.

+0

Tôi tin rằng bạn [không thể sao chép trường mô hình cha mẹ trong mô hình kế thừa] (https : //docs.djangoproject.com/en/1.10/topics/db/models/#field-name-hiding-is-not-permitted) để tùy chọn 1 không hoạt động. –

+0

Bạn không thể sao chép các trường gốc sao cho chúng có cùng một tên trường trong mô hình con ở Django - nhưng bạn có thể sao chép chúng vào một tên trường mới trong mô hình con. Tôi nghĩ bạn có thể thiết lập trình kích hoạt cơ sở dữ liệu để giữ cho các trường được sao chép đồng bộ. Ràng buộc sau đó được thể hiện trên trường được sao chép trong mô hình con như đã giải thích ở trên. (Tôi không nói điều này khá! Nhưng có thể) – jcdude

+0

Ồ, tôi thấy logic ở đó sẽ thực sự hoạt động. Cuối cùng, nếu django_polymorphic được thiết lập để làm việc với các mô hình cơ bản trừu tượng, nó sẽ hoạt động mà không cần hack nó cùng nhau nhưng dường như không có bất kỳ kế hoạch nào để hỗ trợ nó. –

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