Получите идентификатор модели правильно
Я получил две модели. Одна модель для построения главного меню, другая - для статей. Каждая статья имеет 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'),
]
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)
Django doc о поиске связанных объектов, используя_set
,
Редактировать:
Я должен был использовать objects.get()
ранее, но использовал objects.filter()
что неправильно. Разница в том, что вы должны получить ровно один предмет, чтобы вы могли получить связанные с ним статьи. Если вы используете filter
, вы в конечном итоге получите набор запросов, но тогда нет смысла проверять связанные объекты на нескольких объектах, следовательно, ошибка 'QuerySet' object has no attribute 'article_set'
,
Остерегайтесь того, что у вас должно быть alias
за MainMenuItem
объекты, в противном случае get()
выдаст исключение "возвращено несколько объектов".