Проверьте, находится ли объект в QuerySet связанных объектов - PullRequest
2 голосов
/ 19 августа 2010

Я создаю приложение, связанное с игровыми достижениями, и хочу, чтобы для каждой игры отображалась страница со списком связанных достижений. Это сделано.

Однако я также хочу, чтобы каждый пользователь мог видеть в этом списке, какие достижения он выполнил.

Моя модель такая:

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 (думайте о нем как о текущем пользователе).

Проблема в том, что я не могу сделать {% if ach in achieved %} (где ach - это экземпляр достижения и достигнут достигнутый набор запросов), очевидно.

Я также думал, что смогу получить QuerySet с достижениями, которых достиг пользователь, но в нем отсутствует curr_count, который я хочу отобразить.

Я думаю, что мне нужен какой-то список или словарь с достижениями пользователя, по которым я могу проверить, является ли конкретное достижение элементом, но который также будет содержать переменную curr_count. Другое решение может заключаться в том, чтобы каким-то образом добавить curr_count в качестве поля к объекту QuerySet of Achievement (который будет тем, которого достиг пользователь).

Можете ли вы предложить, как сделать это в Django?

1 Ответ

3 голосов
/ 19 августа 2010

Если ваша модель 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 %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...