从模型中获取Django中不存在M2M关系的对象

时间:2016-02-28 07:15:22

标签: python django django-models

型号:

class Home(models.Model):
    name = models.CharField(max_length=100)
    users = models.ManyToManyField(User, through='UserHome')

class UserHome(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    home = models.ForeignKey(Home, on_delete=models.CASCADE)
    date_purchased = models.DateTimeField(default=datetime.now)

如果此模型中有5个家庭,而某个特定用户拥有其中两个,那么获得这两个家庭很简单:

homes = UserHome.objects.filter(user=request.user)

这将只返回用户拥有的两个家庭。但是,如果我想列出模板中的所有房屋并将该用户不拥有的房屋变灰,意味着它列出5个房屋,则3个房屋将变灰,2个房屋将定期显示,有什么内在的方法可以解决这个问题吗?

或者我是否必须使用原始查询或比较两个查询的结果(一个用于所有家庭,一个用于用户的家庭)?

2 个答案:

答案 0 :(得分:1)

我认为你需要做两个问题:

user_homes = UserHome.objects.filter(user=request.user)
ids = [h.home.id for h in user_homes]
other_homes = Home.objects.exclude(id__in=ids)

希望你能在两个名单上建立你的桌子。

答案 1 :(得分:1)

猜猜你可以在单个查询中使用annotate来实现这一点,如下所示:

homes = Home.objects.annotate(is_current_user=Count(users=request.user)).all()

对于与当前用户home.is_current_user相关的家庭将为1,对于所有其他家庭,它将为0.那么您可以迭代并检查它:

for home in homes:
    if home.is_current_user:
        #display home as usual
    else:
        #display home greyed-out as not belonging to current user

上面应该在模板中采用并使用CSS样式,ofc。