如果“多对多”字段包含某个外键,则获取对象

时间:2019-04-17 03:44:13

标签: django django-models django-queryset

我正在尝试在django中实现一个好友系统,并且在验证两个用户已经是好友时遇到了麻烦(以防止重复请求)

该系统的工作方式是让每个用户分别映射到同一个朋友对象以表示友谊。

考虑以下代码

models.py

class Friendship(models.Model): 
    # some other stuff ... 

class FriendshipMapping(models.Model): 
    user_id = models.ForeignKey('User',related_name="friendship_mappings",on_delete=models.CASCADE)
    friendship_id = models.ForeignKey('Friendship',related_name="mapped_by",on_delete=models.CASCADE)
    # some other stuff ...

class User(AbstractUser): 
    friendships = models.ManyToManyField(
        'Friendship', 
        through='FriendshipMapping', 
        symmetrical=True, 
        through_fields=('user_id','friendship_id'), 
        related_name='joined_users', 
    )
    # some other stuff ...

现在说我有2个User对象,并且我想弄清楚两个对象是否都指向了一个友谊对象,而没有获得他们的全部友谊之一并对其进行遍历。我尝试了以下

existing_friendship = user1.friendships.get(joined_users__in=user2)

但是即使我知道他们俩都指向友谊,它也会返回空。

关于这种类型的查找的文档很少,我不确定我的语法是否有效,或者__in最初实际上是做什么的。在django中甚至有可能发生这种情况吗?

将需要帮助!

1 个答案:

答案 0 :(得分:0)

您可以像这样在Friendship中查询与两个用户都关联的FriendshipMapping

existing_friendships = (Friendship.objects
    .filter(mapped_by__user_id=user1)
    .filter(mapped_by__user_id=user2)
)