gpt4 book ai didi

django - Django-过滤相关对象

转载 作者:行者123 更新时间:2023-12-03 13:31:37 25 4
gpt4 key购买 nike

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

最佳答案

filter方法用于根据指定的条件过滤返回哪些对象,因此这不是您想要的。一种选择是进行第二次查询,以检索当前Event的给定User对象的所有评级。

楷模:

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],
}

模板:
{% for event, user_rating in events %}
{% if user_rating %} ... {% endif %}
{% endfor %}

关于django - Django-过滤相关对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/256325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com