Django - 对相关对象进行过滤 [英] Django - filtering on related objects
问题描述
对于我的Django应用,我有事件,评级和用户。评级通过外键与事件和用户相关。当显示事件列表时,我想通过user_id过滤事件的评级,因此我知道事件是否已被用户评级。
如果我这样做:
event_list = Event.objects.filter (rating__user = request.user.id)
(request.user.id给出当前的user_id登录用户)...然后我只得到由用户评估的事件,而不是整个事件列表。
我需要的可以通过自定义SQL:
SELECT *
FROM`events_event`
LEFT OUTER JOIN(
SELECT *
FROM`events_rating`
WHERE user_id = ##
)AS temp
ON events_event.id = temp.user_id
有没有更简单的方法,所以我不必使用自定义SQL?
过滤器
方法用于过滤根据指定的条件返回哪些对象,所以这不是你想要的。一个选择是对当前用户
的给定事件
对象执行第二个查询来检索所有评级。
型号:
导入集合
/ pre>
from django $ db
$ b class RatingManager(models.Manager):
def get_for_user(self,events,user):
ratings = self.filter(event__in = [event.id对于事件中的事件],
user = user)
rating_dict = collections.defaultdict(lambda:无)
用于评分中的评分:
rating_dict [rating.event_id] = rating
return rating_dict
class评级(models.Model):
#...
objects = RatingManager()
查看:
events = Event.objects.all ()
user_ratings = Rating.objects.get_for_user(events,request.user)
context = {
'events':[(event,user_ratings [event.id])事件中的事件],
}
模板:
{%for event,user_rating in events%}
{%if user_rating%} ... {%endif%}
{%endfor%}
For my Django app I have Events, Ratings, and Users. Ratings are related to Events and Users through a foreign keys. When displaying a list of Events I want to filter the ratings of the Event by a user_id so I know if an event has been rated by the user.
If I do:
event_list = Event.objects.filter(rating__user=request.user.id)
(request.user.id gives the user_id of the current logged in user) ...then I only get the events that are rated by the user and not the entire list of events.
What I need can be generated through the custom SQL:
SELECT * FROM `events_event` LEFT OUTER JOIN ( SELECT * FROM `events_rating` WHERE user_id = ## ) AS temp ON events_event.id = temp.user_id
Is there an easier way so I don't have to use custom SQL?
解决方案The
filter
method is for filtering which objects are returned based on the specified criteria, so it's not what you want here. One option is to do a second query to retrieve all ratings for givenEvent
objects for the currentUser
.Models:
import collections from django.db import models class RatingManager(models.Manager): def get_for_user(self, events, user): ratings = self.filter(event__in=[event.id for event in events], user=user) rating_dict = collections.defaultdict(lambda: None) for rating in ratings: rating_dict[rating.event_id] = rating return rating_dict class Rating(models.Model): # ... objects = RatingManager()
View:
events = Event.objects.all() user_ratings = Rating.objects.get_for_user(events, request.user) context = { 'events': [(event, user_ratings[event.id]) for event in events], }
Template:
{% for event, user_rating in events %} {% if user_rating %} ... {% endif %} {% endfor %}
这篇关于Django - 对相关对象进行过滤的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!