Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 16, 2010 22:26:20

Igor Shmigoff
От:
Зарегистрирован: 2010-11-13
Сообщения: 35
Репутация: +  0  -
Профиль   Отправить e-mail  

Как напечатать взаимосвязи

Все привет

Подскажите, как получить кто с кем связан? Т.е. есть модель

 
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)
И вопрос в том, как получить к примеру, какие авторы у книги, к каким паблишем эта книга относится? Т.е. когда я в админке добавляю экземпляры книги, я должен указать зависимости - на автора и агенство, вот как их получить (авторов может быть много)?

Вопрос тупой, но че то как то не соображу. Может какой нить менеджер добавить (хотя я б хотел встроенными методами решить).



Офлайн

#2 Ноя. 17, 2010 08:18:15

svas
От:
Зарегистрирован: 2010-01-27
Сообщения: 239
Репутация: +  9  -
Профиль   Отправить e-mail  

Как напечатать взаимосвязи

Не совсем понятно что и где вам нужно получить

b = Book.object.get(id=1)
b.authors #здесь авторы
b.publisher #здесь publisher



Отредактировано (Ноя. 17, 2010 08:19:34)

Офлайн

#3 Ноя. 17, 2010 09:34:06

Ziberbulger
От:
Зарегистрирован: 2010-05-08
Сообщения: 76
Репутация: +  0  -
Профиль   Отправить e-mail  

Как напечатать взаимосвязи

А не подойдет использовать inlines?
http://www.komtet.ru/info/django/vashe-pervoe-django-prilozhenie-chast-2/?searchterm=None (ближе к концу)
Насколько я помню (поправьте, если не прав), но отношение многие-ко-многим в базе признак того, что она не прошла нормализацию



Офлайн

#4 Ноя. 18, 2010 01:26:15

Igor Shmigoff
От:
Зарегистрирован: 2010-11-13
Сообщения: 35
Репутация: +  0  -
Профиль   Отправить e-mail  

Как напечатать взаимосвязи

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 %}
Далее, если я хочу кликнуть по найденному объекту и вывести всю инфу о нем (если это книга, то путь к ней, авторы), если объект автор - то все книги что он написал. Т.е. я понимаю примерно как, но с реализацией как то туговато.



Офлайн

#5 Ноя. 18, 2010 11:29:44

Ziberbulger
От:
Зарегистрирован: 2010-05-08
Сообщения: 76
Репутация: +  0  -
Профиль   Отправить e-mail  

Как напечатать взаимосвязи

ну во-первых:

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>



Офлайн

#6 Ноя. 18, 2010 11:33:54

Ziberbulger
От:
Зарегистрирован: 2010-05-08
Сообщения: 76
Репутация: +  0  -
Профиль   Отправить e-mail  

Как напечатать взаимосвязи

{{ book.authors.all.0.first_name }}
Да, чтоб сразу с many-to-many не запутались - вот пример кода, который выведет имя первого автора.
Соответственно в цикле можете пройтись по book.authors.all для вывода всех авторов и их атрибутов.



Офлайн

#7 Ноя. 18, 2010 12:56:35

svas
От:
Зарегистрирован: 2010-01-27
Сообщения: 239
Репутация: +  9  -
Профиль   Отправить e-mail  

Как напечатать взаимосвязи

Igor Shmigoff
Далее, если я хочу кликнуть по найденному объекту и вывести всю инфу о нем (если это книга, то путь к ней, авторы), если объект автор - то все книги что он написал. Т.е. я понимаю примерно как, но с реализацией как то туговато.
Ну у вас же в шаблоне в списке есть ссылки на отдельные страницы для каждой книги и автора. На данных страницах и выводите информацию
Вот так для книги - всех авторов
{% for author in book.authors %}
{{ author }}
{% endfor %}
Так для автора - все книги
{% for book in author.book_set %}
{{ book }}
{% endfor %}



Офлайн

#8 Ноя. 18, 2010 15:35:05

Ziberbulger
От:
Зарегистрирован: 2010-05-08
Сообщения: 76
Репутация: +  0  -
Профиль   Отправить e-mail  

Как напечатать взаимосвязи

svas
{% for author in book.authors %} {{ author }} {% endfor %}
а по-моему джанго скажет, что объект many-to-many не поддается итерации



Отредактировано (Ноя. 18, 2010 15:35:43)

Офлайн

#9 Ноя. 18, 2010 16:25:23

svas
От:
Зарегистрирован: 2010-01-27
Сообщения: 239
Репутация: +  9  -
Профиль   Отправить e-mail  

Как напечатать взаимосвязи

Да, вы правы. Надо наверное так

{% for author in book.authors.all %}
{{ author }}
{% endfor %}
И вот так
{% for book in author.book_set.all %}
{{ book }}
{% endfor %}



Отредактировано (Ноя. 18, 2010 16:29:35)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version