开发者

Django query using filters

I have 3 models in django:

class Movie(models.Model):
    mid = models.IntegerField(primary_key = True)
    name = models.CharField(max_l开发者_如何学Goength = 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()

here rating = 0/1, 0 means dislike, 1 means like i want to make some queries using filters:

  1. find out all movies that a current user likes. For that i use this following 2 queries, but none of them work. In both cases it gives erroneous results

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

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

  2. I have a list of users in an array ids. I want to find out how many users from this list like a particular movie? i tried this, but this is also incorrect:

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

can somebody please help me with these 2 queries?


I'd also suggest letting django assign the model's id's but if you are using a legacy database or for some other reason need to assign the id's you can query like so:

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

    or

    likes = Movie.objects.filter(vote__user__uid=some_uid, vote__rating=1)
    
  2. count of people in the list of users who like a specific movie:

    >>> 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
    

    combined:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜