#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 означает «нравится»
я хочу сделать несколько запросов с использованием фильтров:
-
найдите все фильмы, которые нравятся текущему пользователю. Для этого я использую следующие 2 запроса, но ни один из них не работает. В обоих случаях это дает ошибочные результаты
ans = Movie.objects.filter(vote__user = self).filter(vote__rating = 1)
ans = Movie.objects.filter(user__uid = self.uid).filter(vote__rating = 1)
-
У меня есть список пользователей в виде массива идентификаторов. Я хочу узнать, скольким пользователям из этого списка понравился конкретный фильм? я пробовал это, но это также неверно:
ret = User.objects.filter(uid__in = ids).filter(vote__movie = mov).filter(vote__rating = 1)
может ли кто-нибудь, пожалуйста, помочь мне с этими 2 запросами?
Комментарии:
1. В # 1, что такое self? Можете ли вы показать весь метод целиком? Какие объекты вы получаете, когда делаете это?
Ответ №1:
Я бы также предложил разрешить django назначать идентификаторы модели, но если вы используете устаревшую базу данных или по какой-либо другой причине вам необходимо назначить идентификаторы, которые вы можете запросить следующим образом:
-
# 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)
-
количество людей в списке пользователей, которым понравился определенный фильм:
>>> 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()