> 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 :).

well, no, no and no, but interesting anyways.

A tree and it's fruit is the same as a team and it's players.

You'd do

class CherryTree(models.Model):
    name = models.IntegerField()

class CherryFruit(models.Model):
    tree = models.ForeignKey(CherryTree)
    name = models.CharField(max_length=50)

because each cherry belongs to a single tree. You can think of it as a
parent-child relationship, the children are the ones that have the
ForeignKey.

The "through" parameter in a many to many just defines the name of the
table to be used for that "CherriesOnTree" model you put there, which you
wouldn't need to define. Also, the "amount" field would be of no point,
would it?

then you would do this:

# create a new tree
my_tree = Tree("Tree on the corner")
# or maybe get a tree from the database
my_tree = Tree.objects.get(name="Tree on the corner")

# create a new cherry for this tree
cherry = Cherry(tree=my_tree, name="Some Cherry Name")
cherry.save()
## or if you don't need to do anything afterwards, you can simply
Cherry(tree=my_tree, name="Some Cherry Name").save()

a many-to-many would be used, for example, in a classes and students
scenario

Each student goes to many classes, each class has many students, so:

class Class(models.Model):
   name = models.CharField(max_length=50)

class Student(models.Model):
   name = models.CharField(max_length=50)
   classes = models.ManyToManyField(Class)

# create class
math = Class(name="Math")
math.save()

# create student
student = Student(name="Charles")
student.save() # need to save before setting up many to manies
# Charles goes to Math class
student.classes.add(math)

Here an extra table will be created to hold the many-to-many relationships.
I think it's called <appname>_class_m2m_student, or something like that.

The through class is used if you want to add some extra data, like for
example, where does a student seat in a particular class, or what other
students he's in groups with in there, see

https://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany

for more details

-- 
"The whole of Japan is pure invention. There is no such country, there are
no such people" --Oscar Wilde

|_|0|_|
|_|_|0|
|0|0|0|

(\__/)
(='.'=)This is Bunny. Copy and paste bunny
(")_(") to help him gain world domination.

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
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.

Reply via email to