Как аннотировать 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'.
.
Как бы мне это сделать? Заранее спасибо.