我在两个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)我认为我不应该创建一个自定义过滤器,因为这应该很常见
检查模型是否属于与其他模型的多对多关系的正确方法是什么?
答案 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 %}