2017-02-20 7 views
1
class TradeItem(models.Model): 
    ... 

class Wishlist(models.Model): 
    user = models.ForeignKey(User, related_name='wishlist_user') 
    item = models.ForeignKey(TradeItem, related_name='wishlist_item') 

Мне нужно сделать запрос запроса TradeItem аннотированным логическим значением того, находится ли элемент в списке желаний этого пользователя. Что-то вродеDjango аннотировать запрос в зависимости от другого запроса

items = TradeItem.objects.all().annotate(wishlist= 
<heresy> 
if Wishlist.objects.filter(user=request.user, item={current_item}: 
    True 
else: 
    False 
</heresy> 
) 

Можно ли сделать указанную вещь с аннотированием/агрегатом, и что будет наиболее эффективным способом для этого вообще?

ответ

1

Проблема в том, что аннотации происходят на уровне базы данных (SQL). Вы можете использовать только функции, которые накрываются диалоги SQL (например, SUM, AVG ...). Если вы хотите добавить произвольное поле атрибута/данных следует перебрать QuerySet и проверить это для каждого экземпляра seperatly:

items = TradeItem.objects.all() 
user_wishlist = Wishlist.objects.filter(user=request.user) 
for item in items: 
    item.wishlist = user_wishlist.filter(item=item).exists() 
+0

Спасибо, я начал использовать свой метод, и это сделало мой код аккуратнее. Я, к сожалению, не знал, что вы можете сделать qs.something = что-то, такое ужасное. –

Смежные вопросы