Thanks a lot! After few experiments I think I get it :). But! I do have another problem. Lets ditch our football example. Let's say that I have something like that:
class CherryTree(models.Model): name = models.IntegerField() cherries = models.ManyToManyField('CherryFruit') class CherryFruit(models.Model): name = models.CharField(max_length=50) More or less. The point is, I want to ass many CherryFruit to one CherryTree. How do I pass the additional information? I suspect this can have something to do with the 'through' argument, but I'm probably completely wrong. Or do I have to create additional Model, like: class CherriesOnTree(models.Model): name = models.ForeignKey('CherryFruit') tree = models.ForeignKey('CherryTree') amount = models.IntegerField() and add each fruit separately? Hope It's clear what I mean :). W dniu poniedziałek, 25 czerwca 2012 23:16:28 UTC+2 użytkownik Kurtis napisał: > > >> Let me follow up on this. Say I want to add list of all Teams my Players >> played for. What you're saying is that I don't have to add ForeignKey to >> Team and just use team_name field from Team model? Will it work? >> >> This relations stuff is confusing :P. >> >> Haha, no problem! It'll come natural after a while. > > Let's start out with the organization of this. There's really two main > relationships you will deal with. > > *Foreign Keys* > > The first one is ForeignKeys, These are generally used when you want to do > what's called a "One to Many" relationship. > > So, for example, let's say you have several teams and several players. We > could assume that each player is *only* playing for one team at any given > time. This means that you will not find a single player playing for two > times. Under this assumption, you would have a "One to Many" relationship > because one team will have many players. *However*, each player will only > have *one* team. That may sound confusing -- read it over a few times if > it does :) Anyways, this scenario would best be solved by using a > ForeignKey. > > Here's a little visualization just in case that is confusing: > > Team: The Bengals > Players: John, Bob, Tim, Joe > > Team: The Steelers > Players: Adam, Chris, Frank, Steve > > Notice that each player is only playing for one Team. Each team, however, > has multiple players. In this situation, your models would be setup like > this: > > class Team(models.Model): > name = models.CharField(max_length=50) > > class Player(models.Model): > name = models.CharField(max_length=50) > team = models.ForeignKey(Team) > > Now, let's say you want to grab some information about each of these. > > 1. We have the player Joe, how do we get his team? > > print joe.team.name > >> "The Bengals" > > 2. We have the team "The Steelers", how do we get the list of players? > > print steelers.player_set.all() > >> "Adam", "Chris", "Frank", "Steve" > > *Many to Many* > * > * > The other common type of relationship you'll run into is called a Many to > Many relationship. This relationship is, essentially, two Models that can > have relationships with many objects from both sides of the relationship. > So to help you understand and visualize how this works, we're going to take > the previous example and modify it a bit. > > Let's say we have Two Teams and Several People. However, now people are > allowed to play for Multiple teams. In this example, assume that each > player with the same name is the same person (each name is unique). > > Team: The Bengals > Players: Adam, Bob, Charlie > > Team: The Steelers > Players: Donald, Evan, Adam > > Note: Adam plays for both teams. > > So, looking from Adam's perspective, we see that he plays for both the > Steelers and the Bengals. That is -- he has a "many" relationship with the > Teams. Looking at the players from the Team's perspective, it's obvious > that each team has many players. Therefore, in this relationship it is okay > to have Many-to-Many objects from both sides. > > Here's the basic Model setup for this: > > class Team(models.Model): > name = models.CharField(max_length=50) > > class Player(models.Model): > name = CharField(max_length=50) > teams = models.ManyToManyField(Team) > > Let's do a couple of examples to see where this is different. > > 1. Just like before, we have a player but we want to see his Team: > > print donald.teams.all() > >> "The Steelers" > > 2. Now, like before, we want to see this player's team. However, the > Player is no longer restricted to a Single Team. > > print adam.teams.all() > >> "The Bengals", "The Steelers" > > 3. Let's get the reverse relationships -- Who all plays for the Steelers? > > print steelers.player_set.all() > >> "Donald", "Evan", "Adam" > > So, hopefully, from that example you can see that not much has changed > from the perspective of the Team. It already had a "many" relationship with > the players. However, the thing that has changed here is that the players > now have a "many" relationship with the Teams. > > *And to answer your question directly about including the field in the > Team:* > No, you don't need to put a ForeignKey in each Model. You just put it in > once. This will automatically create a variable in your other Model called > <ModelName>_set which can be used to do queries/lookups. Please note that > you can also do something like this to make the naming more practical and > easier to read: > > class Team(models.Model) > name = models.CharField(...) > > class Player(models.Model) > name = models.CharField(...) > teams = models.ManyToManyField(Team, related_name='players') > > Then, you can simply do this: > myteam.players.all() # Notice the word "set" is no longer in there. > > Hopefully that helps a bit and I didn't just confuse you more :) Let us > know if you run into any more problems and good luck! > > > -- You received this message because you are subscribed to the Google Groups "Django users" group. To view this discussion on the web visit https://groups.google.com/d/msg/django-users/-/5THe8RSVGTYJ. To post to this group, send email to django-users@googlegroups.com. To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-users?hl=en.