Django ManyRelatedManager 基于通过类的过滤

发布于 2024-09-27 19:15:29 字数 704 浏览 4 评论 0原文

我有一个基于直通类的简单的多对多关系。

class Person(models.Model):
    friends = models.ManyToManyField('self', through='Friendship')

class Friendship(models.Model):
    me = models.ForeignKey(Person)
    them = models.ForeignKey(Person)
    confirmed = models.BooleanField(default=False)

简而言之,这应该允许某人将其他人添加为朋友,但在其他人确认之前链接不存在。够简单的。

我想向 Person 添加一个 is_friend(self, user) 方法。我想做一些类似的事情:

is_friend(self, user):
    return self.friends.filter(them=user, confirmed=True).count()

但是 filter 似乎只对远程类(在本例中 Person)上进行操作。有什么方法可以在仍然使用 ManyRelatedManager 的同时过滤 Friendship 吗?

I have a simple many-to-many relationship based around a through class.

class Person(models.Model):
    friends = models.ManyToManyField('self', through='Friendship')

class Friendship(models.Model):
    me = models.ForeignKey(Person)
    them = models.ForeignKey(Person)
    confirmed = models.BooleanField(default=False)

This should, in short, allow somebody to add somebody else as a friend, but the link doesn't exist until the other person confirms it. Simple enough.

I want to add a is_friend(self, user) method to Person. In that I want to do something like:

is_friend(self, user):
    return self.friends.filter(them=user, confirmed=True).count()

But filter only seems to operate on the distant class (in this case Person). Is there any way I can filter on Friendship instead while still using the ManyRelatedManager?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

时光与爱终年不遇 2024-10-04 19:15:29

我有点生疏了,但是你尝试过return Friendship.objects.filter(me=self,them=user,confirmed=True)吗?

I'm a bit rusty, but have you tried return Friendship.objects.filter(me=self, them=user, confirmed=True)?

已下线请稍等 2024-10-04 19:15:29

你有没有尝试过:

is_friend(self, user):
    return self.friends.filter(friendship__them=user, friendship__confirmed=True).count()

Have you tried:

is_friend(self, user):
    return self.friends.filter(friendship__them=user, friendship__confirmed=True).count()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文