gpt4 book ai didi

django - 检查对象是否在相关对象的 QuerySet 中

转载 作者:行者123 更新时间:2023-12-04 06:47:50 25 4
gpt4 key购买 nike

我正在构建一个与游戏成就有关的应用程序,我想为每个游戏显示一个列出相关成就的页面。这样做了。

但是,我也希望每个用户都能够在该列表中看到他们已完成的成就。

我的模型是这样的:

class Achievement(models.Model):
game = models.ForeignKey(Game)
...

class Game(models.Model):
...

class GameProfile(models.Model):
achievements = models.ManyToManyField(Achievement, through='Achieved')
...

class Achieved(models.Model):
profile = models.ForeignKey(GameProfile)
achievement = models.ForeignKey(Achievement)
curr_count = models.PositiveSmallIntegerField()

在游戏模板页面,我通过与成就模型(即 achievements = game.achievement_set.all)的关系得到当前游戏的所有成就。然后我做了一个 {% for ach in achievements %}并输出 <li>对于每个。
如果用户已登录,我还想显示与成就关联的 curr_count。所以我需要特定 GameProfile 的 Achieved 对象列表(将其视为当前用户)。

问题是我做不到 {% if ach in achieved %} (其中 ach 是一个 Achievement 实例并实现了一个 Achieved QuerySet),很明显。

我还以为我可以得到一个包含用户已取得成就的 QuerySet,但缺少 curr_count ,我想显示。

我想我想要的是某种带有用户成就的列表或字典,我可以根据它测试特定的成就是否是成员,但它也将带有 curr_count 变量。另一种解决方案可能是以某种方式添加 curr_count作为 Achievement 对象的 QuerySet 的字段(这将是用户已实现的对象)。

你能建议如何在 Django 中实现这一点吗?

最佳答案

如果您的 GameProfile模型有一个链接到 (auth.)User然后您可以生成以下查询集并将其发送到模板。

def achievements_by_user(request, *args, **kwargs):
user = request.user
queryset = Achieved.objects.filter(profile__user = user)
return render_to_response(...)

queryset将过滤来自 Achieved 的所有行基于当前登录的用户。如果您还想根据游戏进行过滤(即返回特定游戏当前登录用户的所有成就),那么您可以添加另一个过滤条件。
    queryset = Achieved.objects.filter(profile__user = user, 
achievement__game = <a game>)

更新

显然我误解了这个问题。这是另一个尝试。
@register.filter
def achievement_in(achieved, achievement):
count = achieved.filter(achievement = achievement).count()
return count > 0

# In template
{% for ach in achievements %}
{% if achieved|achievement_in:ach %}
...
{% else %}
...
{% endif %}
{% endfor %}

关于django - 检查对象是否在相关对象的 QuerySet 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3519658/

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