Аннотировать запрос по существованию в M2M

#python #django #django-models #django-orm

#python #django #django-модели #django-orm

Вопрос:

Схема: таблицы A и B с M2M между ними.

У меня есть некоторый набор запросов QS0 объектов A и один точный экземпляр объекта B.

Как аннотировать QS0 с помощью True, если B связано с A через M2M, и False, если это не так?

Спасибо

Ответ №1:

Приведены примеры моделей ниже

 from django.db import models

class ModelA(models.Model):
    title = models.CharField(max_length=100)


class ModelB(models.Model):
    title = models.CharField(max_length=100)
    a_objects = models.ManyToManyField(ModelA, related_name='b_objects')
 

Теоретически вы должны иметь возможность аннотировать набор ModelA запросов объектов о том, связаны ли они с ModelB объектом следующим образом.

 from django.db.models import Case, When, Value

b_object = ModelB.objects.get(id=some_id)

QS0 = ModelA.objects.annotate(is_linked_to_b=Case(When(b_objects__id=b_object, then=Value(True)), default=Value(False), output_field=BooleanField())

# QSO[some_index].is_linked_to_b should return either True or False.