0

I have 3 models in 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()

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?

1
  • In #1, what is self? Can you show the whole method? What objects do you get when you do this? Commented May 8, 2011 at 23:49

1 Answer 1

1

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()
    
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.