2010-09-24 43 views
6

Tôi đang cố gắng chọn một mô hình bằng cách sử dụng mối quan hệ với khóa chung chung, nhưng nó không hoạt động như mong đợi.Phím nước ngoài chung Django và select_related

Tôi nghĩ đó là minh họa tốt hơn và dễ hiểu với mã

class ModelA(models.Model): 
created = models.DateTimeField(auto_now_add=True) 

class ModelB(models.Model): 
instanceA = models.ForeignKey(ModelA) 

content_type = models.ForeignKey(ContentType) 
object_id = models.PositiveIntegerField() 
content_object = generic.GenericForeignKey() 

class ModelC(models.Model): 
number = models.PositiveIntegerField() 
bInstances = generic.GenericRelation(ModelB) 

# Creating an instance of A and C 
aInstance=ModelA.objects.create() 
cInstance=ModelC.objects.create(number=3) 

# Adding instance of C to the B_set of instance A 
aInstance.modelb_set.add(content_object=cInstance) 

# Select all ModelA instances that have C as content object? Does not work 
whatIWant = ModelA.objects.filter(modelb__content_object=modelCInstance) 

# Pseudo-solution, requires calling whatIWant.modelA 
whatIWant = cInstance.bInstances.select_related("modelA") 

Chỉ cần được rõ ràng, tôi muốn rằng dòng này làm việc: ModelA.objects.filter(modelb__content_object=modelCInstance), rõ ràng django không hỗ trợ sử dụng content_object về mối quan hệ của bộ lọc.

Cảm ơn trước!

+0

Bạn mong đợi điều gì? Chúng tôi không thể trả lời câu hỏi nếu không có câu hỏi nào. –

+0

Tôi đã chỉnh sửa bài đăng để làm cho bài đăng rõ ràng hơn, xin lỗi – Clash

Trả lời

9

Hãy xem http://www.djangoproject.com/documentation/models/generic_relations/. Và thử:

ctype = ContentType.objects.get_for_model(modelCInstance) 
what_you_want = ModelA.objects.filter(modelb__content_type__pk=ctype.id, 
             modelb__object_id=modelCInstance.pk) 

hãy có một cái nhìn tại một số django coding/naming conventions, để làm cho mã của bạn dễ dàng hơn để đọc và hiểu!

+0

Cảm ơn các mẹo! đây có phải cách duy nhất không? Tôi đang tìm kiếm một cái gì đó thân thiện hơn, cảm ơn anyways! – Clash

+2

Vì ContentTypes vv không phải là một phần của lõi django, bộ lọc 'built' tích hợp không biết cách xử lý các truy vấn như vậy, vì vậy bạn phải tự lọc cho content_type AND object_id! –

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