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()
Вернуться на верх