Фильтруйте модель Django на основе другой модели
У меня есть две модели Wellinfo и LOGRD_RPT
class Wellinfo (models.Model):
WellID = models.CharField(max_length=15,unique=True)
Perimeter = models.CharField(max_length=50)
class LOGRD_RPT(models.Model):
WellID = models.CharField(max_length=15, validators= [validate_textComptn])
Мне нужно получить список WellID (ListaWells) из первой модели Wellinfo на основе двух условий:
1- Периметр.
2- если идентификатор скважины существует во второй модели LOGRD_RPT
Итак, первый шаг - получить все скважины, принадлежащие к Field='FD1' в модели Wellinfo
ListaWells= Wellinfo.objects.filter(Perimeter=Field)
тогда мне нужно исключить скважины, которые не существуют во второй модели LOGRD_RPT.
Вы можете использовать Exists подзапрос:
from django.db.models import Exists, OuterRef
ListaWells = Wellinfo.objects.annotate(
log_exists=Exists(LOGRD_RPT.objects.filter(WellID=OuterRef("WellID")))
).filter(Perimetre=Field, log_exists=True)
Или короче:
from django.db.models import Exists, OuterRef
ListaWells = Wellinfo.objects.filter(
Exists(LOGRD_RPT.objects.filter(WellID=OuterRef("WellID"))),
Perimetre=Field,
)
Это работает с этим
ListaWells = Wellinfo.objects.filter(Perimeter=Field)
ListaWell = Wellinfo.objects.filter(Perimeter=Field).values_list('WellID', flat=True).distinct()
LogaWells = LOGRD_RPT.objects.values_list('WellID', flat=True).distinct()
for well in ListaWell:
if well not in LogaWells:
ListaWells = ListaWells.exclude(WellID__exact= well)
и я думаю, что способ, опубликованный neverwalkaloner, лучше, если он работает. Есть другие предложения?