s.spirit
s.spirit

Reputation: 343

Get model ID correctly

I got two models. One model for building main menu, another one - for Articles. Every Article have ForeignKeyto link it to main menu item.

I can't figured out, how can I show on page Article, that linked to menuItem Model and how to use menuItem model's alias field for URL address?

My model menuItem:

    # -*- coding: utf-8 -*-
    from django.db import models

    class MainMenuItem(models.Model):
        class Meta:
            db_table = "menu_item"  
        title = models.CharField(max_length = 50)
        alias = models.CharField(max_length = 50)

        def __unicode__(self):
            return self.title

        def __str__(self):
            return self.title

My model Article:

    class Article(models.Model):
        class Meta:
            db_table = "article"

        menu = models.ForeignKey(MainMenuItem, blank = True, null = True)
        active = models.BooleanField(default = True)
        created = models.DateTimeField(auto_now_add=True)
        updated = models.DateTimeField(auto_now=True)

        def __unicode__(self):
            return unicode(self.menu) or u''

        def __str__(self):
            return self.menu

My views.py

    def menu_builder(request, alias):
        findId = MainMenuItem.objects.????
        elements = {
            'menuItems': MainMenuItem.objects.all(),
            'article': Article.objects.get(id=??????),
        }
        return render_to_response('myview.html', elements)

My urls.py:

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^(?P<alias>.+?)/$', 'menuItem.views.menu_builder'),
    ]

Upvotes: 1

Views: 475

Answers (1)

Shang Wang
Shang Wang

Reputation: 25559

You just filter by the alias on MainMenuItem then get all articles that related to that MainMenuItem:

def menu_builder(request, alias):
    main_menu_item = MainMenuItem.objects.get(alias=alias)
    elements = {
            'menuItems': main_menu_item,
            'articles': main_menu_item.article_set.all(),
        }
    return render_to_response('myview.html, elements)

Django doc about related object lookup using _set.

Edit:

I should have been using objects.get() previously, but was using objects.filter() which is wrong. The difference is that you should get exactly one item so that you could get related articles to that object. If you use filter, you would end up having a queryset, but then it doesn't make sense to check related objects on multiple objects, hence the error 'QuerySet' object has no attribute 'article_set'.

Beware that you should have distinct alias for MainMenuItem objects, otherwise get() would throw an exception "Multiple objects returned".

Upvotes: 2

Related Questions