Django - 通过字段过滤相关对象

Django - Filter related objects by through field

我有以下型号

class User(models.Model):
    ...
    following = models.ManyToManyField('self', blank=True, through='relationships.Relationship', symmetrical=False, related_name='followers')


class Relationship(models.Model):
    from_user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='from_user')
    to_user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='to_user')
    status = models.CharField(max_length=255, default=RelationshipStatus.ACCEPTED.value, choices=[(state.value, state.name) for state in RelationshipStatus])


class RelationshipStatus(Enum):
    ACCEPTED = 'accepted'
    PENDING = 'pending'
    REJECTED = 'rejected'

我想获得给定用户的关注者,但仅限于具有批准关系的那些。

使用以下查询很容易。

Relationship.objects.filter(to_user=a_user, status=RelationshipStatus.ACCEPTED.value)

但我的问题是,如何使用我的用户的 followers 属性来做到这一点?

如果我这样做 a_user.followers.all() 我会得到所有的,但我只想要那些有公认关系的。

那些行不通

a_user.followers.filter(status=RelationshipStatus.ACCEPTED.value)a_user.followers.filter(relationship__status=RelationshipStatus.ACCEPTED.value)

因为引发了以下异常

django.core.exceptions.FieldError: Cannot resolve keyword 'relationship' into field.
django.core.exceptions.FieldError: Cannot resolve keyword 'status' into field.

试试这个:

a_user.followers.filter(to_user__status=RelationshipStatus.ACCEPTED.value)

因为您为字段 to_user 指定了 related_name='to_user'。但是,也许一个表示“Relationship”的名称更合适,否则您可能会混淆它。