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.
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.
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] .
str function in a django model returns a string that is exactly rendered as the display name of instances for that model.
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With