Фильтруйте модель 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, лучше, если он работает. Есть другие предложения?

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