【问题标题】:Get model ID correctly正确获取模型 ID
【发布时间】:2016-10-01 06:44:22
【问题描述】:

我有两个模型。一种用于构建主菜单的模型,另一种用于文章。每篇文章都有ForeignKey链接到主菜单项。

我想不通,如何在页面Article 上显示链接到menuItem 模型以及如何使用menuItem 模型的alias 字段作为URL 地址?

我的模特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

我的模特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

我的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)

我的urls.py

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

【问题讨论】:

    标签: python django django-models django-views django-urls


    【解决方案1】:

    您只需按MainMenuItem 上的别名过滤,然后获取与该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)
    

    关于related object lookup using _set的Django文档。

    编辑:

    我之前应该使用objects.get(),但使用的是objects.filter(),这是错误的。不同之处在于您应该只获得一个项目,以便您可以获得与该对象相关的文章。如果你使用filter,你最终会得到一个查询集,但是检查多个对象上的相关对象是没有意义的,因此会出现错误'QuerySet' object has no attribute 'article_set'

    请注意,MainMenuItem 对象应该有不同的alias,否则get() 会抛出异常“返回多个对象”。

    【讨论】:

    • 嗨!并感谢您的回答。我尝试使用您的代码,但得到了'QuerySet' object has no attribute 'article_set' 我尝试创建相关名称,但仍然出现相同的错误...
    • 我犯了一个错误并更正了我的答案。我试图尽可能多地解释,因为我不想用勺子喂食答案。详情请查看:stackoverflow.com/questions/3221938/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多