Найти - Пользователи
Полная версия: Как напечатать взаимосвязи
Начало » Django » Как напечатать взаимосвязи
1
Igor Shmigoff
Все привет

Подскажите, как получить кто с кем связан? Т.е. есть модель
 
class Publisher(models.Model):
title = models.CharField()

class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)

class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
И вопрос в том, как получить к примеру, какие авторы у книги, к каким паблишем эта книга относится? Т.е. когда я в админке добавляю экземпляры книги, я должен указать зависимости - на автора и агенство, вот как их получить (авторов может быть много)?

Вопрос тупой, но че то как то не соображу. Может какой нить менеджер добавить (хотя я б хотел встроенными методами решить).
svas
Не совсем понятно что и где вам нужно получить
b = Book.object.get(id=1)
b.authors #здесь авторы
b.publisher #здесь publisher
Ziberbulger
А не подойдет использовать inlines?
http://www.komtet.ru/info/django/vashe-pervoe-django-prilozhenie-chast-2/?searchterm=None (ближе к концу)
Насколько я помню (поправьте, если не прав), но отношение многие-ко-многим в базе признак того, что она не прошла нормализацию
Igor Shmigoff
ZiberbulgerСпасибо, но это не совсем то. Речь не про админку (если я в том месте прочитал)

svasСпасибо. Но вопрос у меня глобальный тогда, как мне кажется. Не надо меня отправлять к документации - читал и есть у меня пробел:
То что Вы написали мне понятно. Теперь вопрос: Каким образом мне необходимую детальную инфу о найденном мной объекте передать в шаблон?
Иначе говоря, есть форма поиска.
def search(request, model):
error = False
query = request.GET.get('q', '')
if query:
qset = (
Q(title__icontains=query)
)
results = model.objects.filter(qset).distinct()
else:
#results = []
return render_to_response('search.html', {'error' : True})
return render_to_response("search.html", {
"results": results,
"query": query
})
Она рендерится в шаблон search.html:
<form action="." method="GET">{% csrf_token %}	  
<label for="q">Search: </label>
<input type="text" name="q" value="{{ query|escape }}">
<input type="submit" value="Search">
</form>
{% if query %}
<h2>Results for "{{ query|escape }}":</h2>
{% if results %}
<ul>
{% for file in results|slice:":10" %}
<li><a href="{{ file.get_absolute_url }}">{{ file|escape }}</a></l1>
{% endfor %}
</ul>
{% else %}
<p>No files found</p>
{% endif %}
{% endif %}
Далее, если я хочу кликнуть по найденному объекту и вывести всю инфу о нем (если это книга, то путь к ней, авторы), если объект автор - то все книги что он написал. Т.е. я понимаю примерно как, но с реализацией как то туговато.
Ziberbulger
ну во-первых:
results|slice:":10"
делайте в представлении (я так понимаю, нужно вывести первых 10 совпадений?)

во-вторых - наверное, вы имете ввиду то что вам нужно select_related
query = model.objects.all().select_related()
выбирает все объекты из модели и “скачет” по их взаимосвязям (можно указать глубину)

то есть в представлении
books = Book.objects.all().select_related()[:10]
return render_to_response('your_template.html', {'books':books})
в шаблоне
<html>
...
<body>
{% for book in books %}
{{book.publisher.title}} <!-- выведет имя издателя -->
{% endfor %}
</body>
</html>
Ziberbulger
{{ book.authors.all.0.first_name }}
Да, чтоб сразу с many-to-many не запутались - вот пример кода, который выведет имя первого автора.
Соответственно в цикле можете пройтись по book.authors.all для вывода всех авторов и их атрибутов.
svas
Igor Shmigoff
Далее, если я хочу кликнуть по найденному объекту и вывести всю инфу о нем (если это книга, то путь к ней, авторы), если объект автор - то все книги что он написал. Т.е. я понимаю примерно как, но с реализацией как то туговато.
Ну у вас же в шаблоне в списке есть ссылки на отдельные страницы для каждой книги и автора. На данных страницах и выводите информацию
Вот так для книги - всех авторов
{% for author in book.authors %}
{{ author }}
{% endfor %}
Так для автора - все книги
{% for book in author.book_set %}
{{ book }}
{% endfor %}
Ziberbulger
svas
{% for author in book.authors %} {{ author }} {% endfor %}
а по-моему джанго скажет, что объект many-to-many не поддается итерации
svas
Да, вы правы. Надо наверное так
{% for author in book.authors.all %}
{{ author }}
{% endfor %}
И вот так
{% for book in author.book_set.all %}
{{ book }}
{% endfor %}
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB