2011-09-28 26 views
14

Tôi có (giản thể) mô hình sau đây trong ứng dụng Django của tôi:Django: có được danh sách đối tượng độc đáo từ QuerySet

class Color(models.Model): 
    name = models.CharField(max_length=10) 

class Item(models.Model): 
    name = models.CharField(max_length=200) 
    color = models.ForeignKey(Color, blank=True, null=True) 

class Favorite(models.Model): 
    user = models.ForeignKey(User) 
    item = models.ForeignKey(Item) 

tôi đang nhận được tất cả các mục tôi cần sử dụng các truy vấn sau đây:

favorites = Favorite.objects.filter(user=request.user) 

Làm cách nào để có được tất cả các màu riêng biệt cho các mục trong số QuerySet?

Tôi cần một danh sách các đối tượng màu thực tế, không chỉ là id màu sắc, mà tôi có thể sử dụng

favorites.values_list('item__color').distinct 

Trả lời

20

Nếu tôi hiểu bạn một cách chính xác, sau đây nên làm như lừa:

favorites = Favorite.objects.filter(user=request.user) 
color_ids = favorites.values_list('item__color', flat=True).distinct() 
colors = Color.objects.filter(id__in=color_ids) 

Có một cách rõ ràng hơn mặc dù vậy.

Edit: Một giải pháp sạch hơn nhiều:

colors = Color.objects.filter(item__favorite__user=request.user).distinct() 
+0

+1 nhờ. truy vấn gốc thực sự thực sự phức tạp hơn nhiều so với 'user = request.user' vì vậy kết thúc với phần đầu tiên của câu trả lời của bạn. –

6

Bạn có thể làm:

Color.objects.filter(item__favorite__user = request.user).distinct() 

Bạn có thể phải thiết lập một số related_name s trên phím nước ngoài của bạn nếu đây không phải là giá trị mặc định (Tôi không bao giờ có thể nhớ các giá trị mặc định).

+0

+1 cảm ơn (truy vấn được làm sạch ở trên/dưới có cú pháp chính xác). –

0

Bạn có thể làm:

favorites = Favorite.objects.filter(user=request.user).distinct('item__color') 
Các vấn đề liên quan