Christophe Debove
Christophe Debove

Reputation: 6286

Use a class before its definition in Django model

When I try to syncdb I get the error Menu is not a valid class Name.

How can I resolve that relationship case :

class MenuItem(model.Models)
    title = models.CharField(max_length=200)
    submenus = models.ManyToManyField(Menu, blank=True, null=True)

class Menu(Container):
    links = models.ManyToManyField(MenuItem)

Upvotes: 5

Views: 3673

Answers (2)

mechanical_meat
mechanical_meat

Reputation: 169264

From the Django book:

If you need to create a relationship on a model that has not yet been defined, you can use the name of the model, rather than the model object itself:

E.g.:

class MenuItem(model.Models)
    title = models.CharField(max_length=200)
    submenus = models.ManyToManyField('Menu', blank=True, null=True)
                                      ^    ^

Edit:
As Francis mentions (and as is written in the documentation):

It doesn't matter which model has the ManyToManyField, but you should only put it in one of the models -- not both.

Upvotes: 10

Francis Yaconiello
Francis Yaconiello

Reputation: 10919

One of these models has a many to many, the other one uses Django's reverse relations (https://docs.djangoproject.com/en/dev/topics/db/queries/#following-relationships-backward)

So how I would set it up:

class Menu(Container):
    links = models.ManyToManyField(MenuItem)

class MenuItem(model.Models)
    title = models.CharField(max_length=200)

Then when I wanted a MenuItem's Menus:

menu_item_instance.menu_set.all()

Upvotes: 6

Related Questions