Проверка, принадлежат ли две модели отношению «многие ко многим» - PullRequest
0 голосов
/ 12 мая 2011

У меня были отношения «многие ко многим» между двумя моделями Django:

from django.contrib.auth.models import User
class UserProfile(models.Model):
    user = models.OneToOneField(User)
    ...
    bees = models.ManyToManyField('Bee')
class Bee(models.Model):
    ...

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

@register.filter
def my_filter(user, bee):
    userprofile = user.get_profile()
    return bee in userprofile.bees.all()

, и в шаблоне я могу использовать его так:

{% for bee in bees %}
    {% if user|my_filter:bee %}
        I am in {{ bee }}
    {% else %}
        I am not in {{ bee }}
    {% endif %}
{% endfor %}

, ноэто кажется хакерским, так как 1) я позвонил .all () - загрузил всех пчел, включая пчел, которые мне не интересны - без использования результатов, 2) я не думаю, что мне нужно создавать пользовательский фильтрпоскольку это должно быть довольно распространенным явлением

Как правильно проверить, принадлежит ли Модель отношениям «многие ко многим» с другой Моделью?

Ответы [ 2 ]

2 голосов
/ 12 мая 2011

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

{% if special_bee in profile_instance.bees.all %}
    This profile is related to this special bee.
{% endif %}
1 голос
/ 13 мая 2011

Вы можете получить список идентификаторов пчел пользователя в вашем представлении. Примерно так:

def view(request):
    user_bee_ids = request.user.bees.all().values_list('pk', flat=True)

И тогда в вашем шаблоне вы можете сделать это:

{% if bee.pk in user_bee_ids %}
    I am in {{ bee }}
{% else %}
    I am not in {{ bee }}
{% endif %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...