2010-01-28 26 views
5

Tôi có một mô hình trong Django có một cái gì đó như thế này:Query cho một Dòng ManytoMany với Qua trong Django

class Classification(models.Model): 
    name = models.CharField(choices=class_choices) 
    ... 

class Activity(models.Model): 
    name = models.CharField(max_length=300) 
    fee = models.ManyToManyField(Classification, through='Fee') 
    ... 

class Fee(models.Model): 
    activity = models.ForeignKey(Activity) 
    class = models.ForeignKey(Classification) 
    early_fee = models.IntegerField(decimal_places=2, max_digits=10) 
    regular_fee = models.IntegerField(decimal_places=2, max_digits=10) 

Ý tưởng được rằng sẽ có một tập hợp các chi phí liên quan với mỗi hoạt động và phân loại cặp. Phân loại giống như Sinh viên, Nhân viên, v.v.

Tôi biết rằng phần đó hoạt động đúng.

Sau đó, trong ứng dụng của tôi, tôi truy vấn cho một tập hợp các hoạt động với:

activities = Activity.objects.filter(...) 

nào trả về một danh sách các hoạt động này. Tôi cần hiển thị trong mẫu của tôi danh sách Hoạt động với Phí của họ. Một cái gì đó như thế này:

Activity Name 
Student Early Price - $4 
Student Regular Price - $5 
Staff Early Price - $6 
Staff Regular Price - $8 

Nhưng tôi không biết cách dễ dàng để có được thông tin này mà không có truy vấn cụ thể của đối tượng Phí cho mỗi cặp hoạt động/lớp học.

Tôi hy vọng điều này sẽ làm việc:

activity.fee.all() 

Nhưng đó chỉ trả về đối tượng phân loại. Có cách nào để lấy Dữ liệu Đối tượng Phí cho Cặp thông qua các Hoạt động mà tôi đã truy vấn không?

Hoặc tôi đang làm điều này hoàn toàn sai?

Trả lời

5

Xét mũi michuk để đổi tên "Phí" để "phân loại":

tên mặc định cho đối tượng Phí trên mô hình Hoạt động sẽ được fee_set. Vì vậy, để có được giá của bạn, hãy thực hiện điều này:

for a in Activity.objects.all(): 
    a.fee_set.all() #gets you all fees for activity 

Có một số điều bạn có thể làm với một đối tượng hoạt động cho phí, có một số ứng dụng có thể trợ giúp ví dụ, django-batch-select chỉ có 2 truy vấn trong trường hợp này.

1

Trước hết, tôi nghĩ bạn đã đặt tên cho trường của mình là sai. Đây:

fee = models.ManyToManyField(Classification, through='Fee') 

nên đúng hơn là:

classifications = models.ManyToManyField(Classification, through='Fee') 

như ManyToManyField đề cập đến một danh sách các đối tượng có liên quan.

Nói chung ManyToManyField, AFAIK, chỉ là một phím tắt django để cho phép dễ dàng tìm nạp tất cả các đối tượng liên quan (Phân loại trong trường hợp của bạn), với bảng kết hợp là minh bạch cho mô hình. Những gì bạn muốn là bảng kết hợp (Phí trong trường hợp của bạn) không phải là trong suốt.

Vì vậy, điều tôi sẽ làm là xóa trường ManyToManyField khỏi Hoạt động và chỉ cần nhận tất cả các khoản phí có liên quan đến hoạt động. Và thenm nếu bạn cần một Phân loại cho mỗi khoản phí, hãy phân loại riêng biệt.

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