Django - Запрос постов, относящихся к целям по категориям?

У меня есть несколько моделей, в которых каждая категория состоит из целей. Например, "Здоровье" - это категория, а "похудеть на 10 фунтов к моей свадьбе" - это цель в этой категории. Затем у меня есть посты для этой цели. Например, пост 1 может быть о первом дне пути к потере веса и так далее, и так далее. Мне нужно иметь возможность запросить все посты по категориям, а ответом должен быть список диктов, в котором содержатся: тело поста, название цели, дата создания. Как я могу быстро получить такой запрос? Текущий метод, который у меня есть, я считаю менее чем идеальным. Я собирался запрашивать цели по категориям, а потом запрашивать посты по целям, но тогда мне пришлось бы итеративно добавлять описание цели к каждому посту, а затем возвращать его. Это может быть очень медленно. Думаю, в идеале я бы хотел фильтровать категории по нужной мне категории, затем соединять цели с этим типом, затем соединять посты и возвращать соответствующие столбцы.

.
class Goal(AbstractBaseModel):
    creator_id = models.ForeignKey(
        User, on_delete=models.SET_NULL, null=True, related_name="goal_creator_id")
    end_date = models.DateField(
        'End date', null=True, default=None, blank=True)
    category = models.ForeignKey(GoalCategory, on_delete=models.CASCADE)
    description = models.CharField(
        max_length=255, validators=[MinLengthValidator(5)])

class Post(AbstractBaseModel):
    creator_id = models.ForeignKey(
        User, on_delete=models.CASCADE, related_name="post_creator_id")
    goal_id = models.ForeignKey(Goal, on_delete=models.CASCADE)
    body = models.CharField(max_length=511, validators=[MinLengthValidator(5)])
    hash_tags = models.ManyToManyField(HashTag)

class GoalCategory(models.Model):
    category = models.CharField(max_length=25, primary_key=True, validators=[
                                MinLengthValidator(5)])
    emoji_url = models.CharField(max_length=2083, validators=[
                                 MinLengthValidator(8)])


@api_view(['GET'])
def get_most_recent_posts_by_category(request, category, count):
    goal_uuid_list = list(Goal.objects.filter(category = category).values_list('uuid', flat=True))
    Post.objects.filter(goal_id__in=goal_uuid_list).values('description', 'uuid')

Я придумал это решение, но оно кажется менее идеальным, потому что мне также приходится переименовывать ключи

def get_most_recent_posts_by_category(request, category, count):
    goals_list = list(Goal.objects.filter(category = category).values_list('uuid', flat=True))
    data = list(Post.objects.filter(goal_id__in=goals_list).order_by('created').values('body', 'goal_id__description', 'created'))
    data['goal_description'] = data['goal_id__description']
    data['post_body'] = data['body']
    del data['goal_description']
    del data['body']
    return JsonResponse(data, status=status.HTTP_200_OK)
Вернуться на верх