Эта запись связана со мной? - PullRequest
0 голосов
/ 11 июня 2011

У меня есть две модели, которые связаны друг с другом.Для надуманного примера первый - это список вещей, а второй - список людей, которым понравилась каждая вещь.

Я хочу показать список вещей, и если мне понравилась одна из них, топоказать значок рядом с ним.

# in the models
class Things(models.Model):
    name = models.CharField(max_length = 100)

class Likes(models.Model):
    user = models.ForeignKey(User)
    thing = models.ForeignKey(Thing)

# in the view
@login_required
def list_of_things(request):
    things = things.objects.all()
    context = RequestContext(request, {'things': things})
    return render_to_response('thinglist.html', context)

# in the template
{% for thing in things %}
<li>{{ thing.name }}
  ## PSUEDO CODE HERE
  {% if I've liked this thing %}
  <img src="like.png">
  {% endif %}
</li>

Я обнаружил, что в оболочке Python я могу сделать это:

>>> thing.likes_set.filter(user=user)

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

{% if thing.liked_by_me %}

Но для этого модель должна знать имя пользователя.Кроме того, похоже, что это не самая лучшая производительность.

Есть предложения?

1 Ответ

1 голос
/ 12 июня 2011

По вашему мнению, для лучшей производительности вы можете получить список вещей и список вещей, которые вам нравятся.

def list_of_things(request):
    things = things.objects.all()
    things_i_like = Like.objects.filter(user=current_user).values_list('things', flat=True)
    context = RequestContext(request, {'things': things, 'things_i_like':things_i_like})
    return render_to_response('thinglist.html', context)

values_list будет выбирать только «вещи» flat сведет QuerySet в список

{% for thing in things %}
<li>{{ thing.name }}
  ## PSUEDO CODE HERE
  {% if thing in things_i_like %}
   ## IMAGE LINK
  {% endif %}
</li>
{% endfor %}

Затем шаблон может перебрать «вещи» и проверить, есть ли одна вещь в списке «things_i_like»

Я не проверял это, но оно должно работать ...

...