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”的名称更合适,否则您可能会混淆它。
我有以下型号
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”的名称更合适,否则您可能会混淆它。