Сложный запрос Django в отношениях многих ко многим - PullRequest
3 голосов
/ 09 января 2012

У меня есть следующие модели

class Book(models.Model):
    name        = models.CharField(max_length=140)

class UserProfile(models.Model):
    favorites    = models.ManyToManyField(Book, null=True, blank=True)
    user         = models.OneToOneField(User)

Мне нужно составить список всех книг и показать, какие из них являются избранными, а какие нет.

Мне нужен набор запросов для представления, которое дает мне все книги, такие как

Book.objects.all()

но мне также нужно знать для каждой книги, является ли она фаворитом для этого пользователя, а затем передать этот набор запросов в шаблон.

Спасибо.

1 Ответ

2 голосов
/ 09 января 2012

Это относительно простое использование ManyToManyField.

class Book(models.Model):
    name        = models.CharField(max_length=140)

class UserProfile(models.Model):
    favorites    = models.ManyToManyField(Book, null=True, blank=True)
    user         = models.OneToOneField(User)

favorite_books = this_user_profile.favorites.all()
for b in Book.objects.all():
    if b in favorite_books:
        print "Book", b.name, "is a favorite of this user!"
    else:
        print "Book", b.name, "is not a favorite of this user!"

ETA: поскольку вы говорите, что хотите добавить его в шаблон, дайте его шаблону в виде списка кортежей.

book_list = [(b, (b in favorite_books)) for b in Book.objects.all()]

В вашем шаблоне есть код

{% for book, is_favorite in book_list %}
    {% if is_favorite %}
        {% comment %} Do something with this favorite book {% endcomment %}
    {% else %}
        {% comment %} Do something with this non favorite book {% endcomment %}
    {% endif %}
{% endfor %}
...