检查两个模型是否属于多对多关系

时间:2011-05-12 18:57:34

标签: django many-to-many

我在两个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 %}

但是这似乎是hackish 1)我打电话给.all() - 加载所有蜜蜂,包括我不感兴趣的蜜蜂 - 没有使用结果,2)我认为我不应该创建一个自定义过滤器,因为这应该很常见

检查模型是否属于与其他模型的多对多关系的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

如果您想检查模板,可以查看in operator

{% if special_bee in profile_instance.bees.all %}
    This profile is related to this special bee.
{% endif %}

答案 1 :(得分:1)

您可以在视图中获取用户蜜蜂ID列表。像这样:

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 %}