Добавить логическое поле, если строка существует в другой таблице?

У меня есть две таблицы, называемые Post и Reply . Пользователи могут создавать только один Response для каждого Post . Модели выглядят так:

 class Post(models.Model): name = models.CharField(max_length = 100) class Reply(models.Model): post = models.ForeignKey(Post, related_name = 'replies') 

Теперь у меня есть представление, которое возвращает сообщения, например:

 class PostList(generics.ListAPIView): permission_classes = (permissions.IsAuthenticated,) queryset = Post.objects.all() serializer_class = PostSerializer 

И сериализатор для сообщений:

 class PostSerializer(serializers.ModelSerializer): class Meta: fields = ('id', 'name') 

Результаты этого представления выглядят следующим образом:

 [ { "id": "1", "name": "The first post" }, { "id": "2", "name": "The second post" } ] 

Теперь, к фактической проблеме, о которой идет речь: я хотел бы иметь логическое поле в результатах, которое было бы true если пользователь ответил на сообщение, а false если они этого не сделали. В принципе, результат для ситуации, когда текущий пользователь ответил на первый пост, но не на второй пост, будет выглядеть так:

 [ { "id": "1", "name": "The first post", "replied": "true" }, { "id": "2", "name": "The second post", "replied": "false" } ] 

Как мне это достичь? У меня есть подозрение, что это как-то должно быть реализовано в сериализаторе, но я не знаю, как это сделать.

Заранее благодарим за вашу помощь!

Опираясь на ответ дайдека.

Вы перезаписываете свой get_queryset в представлении Api

 class PostList(generics.ListAPIView): ... def get_queryset(self): Post.objects.all().extra(select={ 'current_user_replies_count': 'SELECT COUNT(*) FROM <reply table> WHERE' + 'post_id=posts_post.id AND owner_id = %s' },select_params=(request.user.id,)) 

Это добавит 'current_user_replies_count' как свойство объектов Post в вашем наборе запросов.

Следующая проблема здесь для многих запросов sql, когда вы будете получать, например. 100 объектов (у вас будет BASE_QUERIES_COUNT + len (объекты)). Из корней мы не хотим, чтобы числовые запросы sql-запросов подсчитывались, и эта ситуация никогда не должна происходить, особенно в производственной версии. Идеальное решение здесь было бы, если бы мы могли получить все данные, полученные в одном запросе sql. Это возможно при переопределении метода get_queryset (здесь https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/generics.py#L47 ). И тогда запрос может выглядеть примерно так: param current_user_replies_count доступен как обычная переменная экземпляра модели.

 # all only for example Post.objects.all().extra(select={ 'current_user_replies_count': 'SELECT COUNT(*) FROM <reply table> WHERE '+ 'post_id=posts_post.id AND owner_id = %s' }, select_params=(request.user.id,) ) 

Я не тестировал его, поэтому используйте его скорее как пример вместо готового решения, и вы должны использовать current_user_replies_count для bool.

Вы можете добавить настраиваемые поля в свой PostSerializer

 class PostSerializer(serializers.ModelSerializer): replied = serializers.SerializerMethodField('has_replies') def has_replies(post): return post.replies.filter(owner=self.context["request"].user).exists() class Meta: fields = ('id', 'name', 'replied')