Django - Вернуть все объекты в таблице, где атрибут A находится в списке B ИЛИ атрибут C находится в списке D
Ниже у меня есть такой код, где запрос имеет текущий объект User
. У User
могут быть "последователи", которые представлены FollowUser
, и они могут следовать за целью другого пользователя, который представлен FollowGoal
. Я хочу вернуть все посты текущего пользователя, который представлен request.user
. Я хочу иметь возможность получить все сообщения, в которых creator
является кем-то, за кем следует текущий пользователь, или является целью, за которой следует текущий пользователь. Как вы можете видеть ниже, я создаю список UUID
как для followees
текущего пользователя (людей, за которыми он следует), так и для UUID
целей, за которыми следует текущий пользователь. Затем я делаю <attribute>__in
, но по какой-то причине он возвращает пустой список. Даже если я просто фильтрую по последователям или по целям. Не уверен, почему он возвращает пустой список. Я создал фальшивые данные, которые представляют собой как случаи постов, созданных последователями текущего пользователя, так и цели, за которыми следует текущий пользователь. Объект Post
должен фильтровать, если создатель поста - человек, за которым следует текущий пользователь, ИЛИ цель - цель, за которой следует текущий пользователь.
view.py
def get_current_user_followee(request):
current_user = request.user
followee_list = list(FollowUser.objects.filter(follower=current_user).values_list('followee', flat=True))
followee_list.append(current_user.uuid)
return [str(followee) for followee in followee_list]
def get_current_user_join_goal_follow(request):
current_user = request.user
join_goal_list = list(FollowGoal.objects.filter(follower=current_user).values_list('uuid', flat=True))
return [str(join_goal_follow) for join_goal_follow in join_goal_list]
@api_view(['GET'])
def get_initial_posts(request, count):
join_goal_list = get_current_user_join_goal_follow(request)
followee_list = get_current_user_followee(request)
serializer = full_post_data_serializer(
Post.objects.filter(join_goal__in=join_goal_list, creator__in=followee_list).order_by('-uuid')[:count])
return Response(serializer.data, status=status.HTTP_200_OK)
model.py
class Post(models.Model):
# ulid does ordered uuid creation
uuid = models.UUIDField(primary_key=True, default=generate_ulid_as_uuid, editable=False)
created = models.DateTimeField('Created at', auto_now_add=True)
updated_at = models.DateTimeField('Last updated at', auto_now=True, blank=True, null=True)
creator = models.ForeignKey(
User, on_delete=models.CASCADE, related_name="post_creator")
join_goal = models.ForeignKey(JoinGoal, on_delete=models.CASCADE)
body = models.CharField(max_length=511, validators=[MinLengthValidator(5)])
hash_tags = models.ManyToManyField(HashTag)
type = models.CharField(
choices=PostType.choices,
max_length=2,
)
class FollowGoal(AbstractSimpleModel):
follower = models.ForeignKey(
User, on_delete=models.CASCADE, related_name='goal_follow')
join_goal = models.ForeignKey(JoinGoal, on_delete=models.CASCADE)
# No update added, because cannot be edited. Can only be added and deleted
class FollowUser(AbstractSimpleModel):
follower = models.ForeignKey(
User, on_delete=models.CASCADE, related_name='follower_id')
followee = models.ForeignKey(
User, on_delete=models.CASCADE, related_name='followee_id')
# No update added, because cannot be edited. Can only be added and deleted
class User(AbstractDatesModel):
uuid = models.UUIDField(primary_key=True)
username = models.CharField(max_length=255, unique=True, validators=[
MinLengthValidator(8)])
created = models.DateTimeField('Created at', auto_now_add=True)
updated_at = models.DateTimeField('Last updated at', auto_now=True, blank=True, null=True)
Post.objects.filter(join_goal__in=join_goal_list, creator__in=followee_list)
вроде бы близко, но это означает ОБА join_goal в my_list И creator в followees
для соединения с помощью OR необходимо использовать Q-выражения
from django.db.models import Q
join_goal_query = Q(join_goal__in = join_goal_list)
follower_post_query = Q(creator__in = followee_list)
is_join_goal_OR_follower_post = join_goal_query | follower_post_query
Post.objects.filter(is_join_goal_OR_follower_post ).all()