2011-05-12 60 views
0

我有两个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

什么是“蜜蜂”应该是在你的过滤器?我猜,与“蜜蜂”有关的“蜜蜂”是什么? – 2011-05-12 21:53:48

+0

@Bryce Siedschlaw:蜜蜂是蜜蜂的一种复数(我通常对容器(例如列表,字典)或数据库表使用复数名称,对非容器或数据库行使用单数名称,另外,我还添加了一些更正这个问题不那么令人困惑(我在早上4点写信道歉)。 – 2011-05-13 10:12:22

回答

1

您可以在您的视图中获取用户的蜜蜂标识列表。事情是这样的:

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

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

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