Django - 对相关对象进行过滤 [英] Django - filtering on related objects

查看:91
本文介绍了Django - 对相关对象进行过滤的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

对于我的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?

解决方案

过滤器方法用于过滤根据指定的条件返回哪些对象,所以这不是你想要的。一个选择是对当前用户的给定事件对象执行第二个查询来检索所有评级。



型号:

 导入集合

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()
/ pre>

查看:

  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 given Event objects for the current User.

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆