Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to filter model results for multiple values for a many to many field in django

Tags:

python

django

I have the following Model:

class Group(models.Model):     member = models.ManyToManyField(Player, through='GroupMember')     name = models.CharField(max_length=20, unique=True)     join_password = models.CharField(max_length=20)     date_created = datetime.datetime.now()      def __unicode__(self):         return str(self.name)  class GroupMember(models.Model):     member = models.ForeignKey(Player)     group = models.ForeignKey(Group)     rating = models.IntegerField(default=1500)     played = models.IntegerField(default=0)     wins = models.IntegerField(default=0)     losses = models.IntegerField(default=0)     experience = models.IntegerField(default=0)     admin = models.BooleanField(default=0) 

As you can see the group is made up of members who are players. What I would like to do is given two players I would like to be able to filter the groups that contain both of these players but I am unsure how to do this type of query.

like image 963
Jayyyyy Avatar asked Feb 23 '12 09:02

Jayyyyy


People also ask

How do you do a many-to-many relationship in Django?

To define a many-to-many relationship, use ManyToManyField . What follows are examples of operations that can be performed using the Python API facilities. You can't associate it with a Publication until it's been saved: >>> a1.

How can I filter a Django query with a list of values?

To filter a Python Django query with a list of values, we can use the filter method with in . to search Blog entries with pk set to 1,4 or 7 by calling Blog. objects. filter with the pk_in argument set to [1, 4, 7] .

What is __ Str__ in Django?

str function in a django model returns a string that is exactly rendered as the display name of instances for that model.


1 Answers

If your Player model looks like this:

class Player(models.Model):     name = models.CharField(max_length=200) 

Then, you can execute this query:

Group.objects.filter(player__name__in=['Player1','Player2']) 

Which roughly translates to "find all groups that have players whose names match 'Player1' and 'Player2'"

Or you can fetch the player objects individually:

p1 = Player.objects.get(name='Player1') p2 = Player.objects.get(name='Player2') groups = Group.objects.filter(player=p1).filter(player=p2) 
like image 102
Burhan Khalid Avatar answered Sep 18 '22 15:09

Burhan Khalid