Запрос Django с использованием фильтров

#django #django-models

#django #django-модели

Вопрос:

У меня есть 3 модели в django:

 class Movie(models.Model):
    mid = models.IntegerField(primary_key = True)
    name = models.CharField(max_length = 100)

class User(models.Model):
    username = models.CharField(max_length=128, null=True)
    uid = models.CharField(max_length=100)
    movie = models.ManyToManyField(Movie, through = "Vote")

class Vote(models.Model):
    movie = models.ForeignKey(Movie)
    user = models.ForeignKey(User)
    rating = models.IntegerField()
  

здесь рейтинг = 0/1, 0 означает «не нравится», 1 означает «нравится»
я хочу сделать несколько запросов с использованием фильтров:

  1. найдите все фильмы, которые нравятся текущему пользователю. Для этого я использую следующие 2 запроса, но ни один из них не работает. В обоих случаях это дает ошибочные результаты

    ans = Movie.objects.filter(vote__user = self).filter(vote__rating = 1)

    ans = Movie.objects.filter(user__uid = self.uid).filter(vote__rating = 1)

  2. У меня есть список пользователей в виде массива идентификаторов. Я хочу узнать, скольким пользователям из этого списка понравился конкретный фильм? я пробовал это, но это также неверно:

    ret = User.objects.filter(uid__in = ids).filter(vote__movie = mov).filter(vote__rating = 1)

может ли кто-нибудь, пожалуйста, помочь мне с этими 2 запросами?

Комментарии:

1. В # 1, что такое self? Можете ли вы показать весь метод целиком? Какие объекты вы получаете, когда делаете это?

Ответ №1:

Я бы также предложил разрешить django назначать идентификаторы модели, но если вы используете устаревшую базу данных или по какой-либо другой причине вам необходимо назначить идентификаторы, которые вы можете запросить следующим образом:

  1.  # uid is some uid
    user = User.objects.get(uid=uid)
    likes = Movie.objects.filter(vote__user=user, vote__rating=1)
      

    или

     likes = Movie.objects.filter(vote__user__uid=some_uid, vote__rating=1)
      
  2. количество людей в списке пользователей, которым понравился определенный фильм:

     >>> uids = ['1','2','3']
    >>> # if mov is a Movie instance
    >>> votes = Vote.objects.filter(user__uid__in=uids, movie=mov, rating=1)
    >>> print votes.query
    SELECT "so1_vote"."id", "so1_vote"."movie_id", "so1_vote"."user_id", "so1_vote"."rating" FROM "so1_vote" INNER JOIN "so1_user" ON ("so1_vote"."user_id" = "so1_user"."id") WHERE ("so1_user"."uid" IN (1, 2, 3) AND "so1_vote"."movie_id" = 1  AND "so1_vote"."rating" = 1 )
    >>> # if mov is a mid for a movie
    >>> # get movie instance by using Movie.objects.get(mid=mov)
    >>> # or query:
    >>> # votes = Vote.objects.filter(user__uid__in=uids, movie__mid=mov, rating=1)
    >>> likes_count = votes.count()
    >>> print likes_count
    0
      

    комбинированный:

     likes_count = Votes.objects.filter(user__uid__in=uids, movie=mov, rating=1).count()