Как аннотировать QuerySet результатом другого QuerySet, который использует поле первого?

В настоящее время я работаю над django backend приложения, которое позволяет пользователям размещать маркеры камер, каждый из которых содержит несколько камер.
Модели, с которыми я работаю:

class CameraMarkers(models.Model):
    # Field name made lowercase.
    marker_id = models.AutoField(db_column='Marker_ID', primary_key=True)
    # Field name made lowercase.
    city = models.CharField(db_column='City', max_length=25)
    # Field name made lowercase.
    num_of_cams = models.IntegerField(db_column='Num_of_Cams')
    # Field name made lowercase.
    zipcode = models.CharField(
        db_column='Zipcode', max_length=6, blank=True, null=True)
    # Field name made lowercase.
    street = models.CharField(
        db_column='Street', max_length=50, blank=True, null=True)
    # Field name made lowercase.
    house_num = models.CharField(
        db_column='House_num', max_length=10, blank=True, null=True)
    # Field name made lowercase.
    company = models.CharField(
        db_column='Company', max_length=12, blank=True, null=True)
    # Field name made lowercase.
    contact_name = models.CharField(
        db_column='Contact_name', max_length=50, blank=True, null=True)
    # Field name made lowercase.
    email_address = models.CharField(
        db_column='Email_address', max_length=50, blank=True, null=True)
    # Field name made lowercase.
    phone_num = models.CharField(
        db_column='Phone_num', max_length=15, blank=True, null=True)
    # Field name made lowercase.
    date_of_visit = models.CharField(
        db_column='Date_of_visit', max_length=10, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'Camera Markers'


class Cameras(models.Model):
    # Field name made lowercase.
    camera_id = models.AutoField(db_column='Camera_ID', primary_key=True)
    # Field name made lowercase.
    status = models.CharField(db_column='Status', max_length=20)
    # Field name made lowercase.
    view = models.TextField(db_column='View', blank=True, null=True)
    # Field name made lowercase.
    marker = models.ForeignKey(
        CameraMarkers, models.DO_NOTHING, db_column='Marker_ID')
    # Field name made lowercase.
    longitude = models.FloatField(db_column='Longitude', blank=True, null=True)
    # Field name made lowercase.
    latitude = models.FloatField(db_column='Latitude', blank=True, null=True)
    # Field name made lowercase.
    retention_time_days = models.IntegerField(
        db_column='Retention_time_days', blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'Cameras'

Итак, каждая камера связана с маркером камеры.
Теперь я хочу создать функцию в views.py, которая возвращает все CameraMarker в базе данных, аннотированную полем 'cameras', содержащим список всех ассоциированных камер, также извлеченных из базы данных.
. Однако я не могу заставить это работать. Я уже пробовал следующее:

@api_view(['GET'])
def getAllCameraMarkersWithCameras(request):
    subquery_cameras = Cameras.objects.filter(marker=OuterRef("marker_id"))
    markers = CameraMarkers.objects.annotate(
        associated_cameras=Subquery(subquery_cameras, output_field=models.TextField())).values()
    return JsonResponse(list(markers), safe=False)

Но это возвращает 'django.db.utils.ProgrammingError: subquery must return only one column'.
. Как бы мне это сделать? Заранее спасибо.

Вернуться на верх