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

У меня есть две таблицы, называемые 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" } ] 

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

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

3 Solutions collect form web for “Добавить логическое поле, если строка существует в другой таблице?”

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

Вы перезаписываете свой 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') 
  • Django DRF с oAuth2 с использованием DOT (django-oauth-toolkit)
  • регистрация пользователя django rest
  • Опубликовать в API Django rest framework, но всегда получать ошибку «Это поле обязательно»
  • Разрешения для объектов с доступом только для чтения для анонимных пользователей в Django Rest Framework
  • Django REST Framework PATCH не работает в обязательных полях
  • Интеграция Ember CLI с приложением Django
  • Django REST Framework: создание иерархических объектов с использованием URL-адресов
  • OperationalError, нет такого столбца. Джанго
  •  
    Interesting Posts for Van-Lav

    Как я могу захватить все записи журнала python, созданные во время выполнения ряда задач Celery?

    Как я могу использовать cProfile python для профилирования приложения django во время работы на пулеметном

    : синопсис: не работает в автомодуле Sphinx

    Идентификатор потока Python, который указан сверху

    Установлен ли python s.difference_update (t) O (m X n)

    эффективно преобразовать строку (или кортеж) в массив ctypes

    отправить запрос с использованием python на страницу asp.net

    лучший способ конвертировать этот html-файл в xml-файл с помощью python

    ALTER TABLE Sqlite: как проверить, существует ли столбец перед изменением таблицы?

    Как прекратить получение ImportError: не удалось импортировать настройки «mofin.settings» при использовании django с wsgi?

    Вычисление с научной осью, изменение количества значимых цифр

    Вызов функций AutoIt в Python

    binning dataframe в пандах в Python

    Pandas: функция экспоненциального сглаживания для столбца

    Как узнать, был ли sys.stdout удален в Python

    Python - лучший язык программирования в мире.