基于其他模型过滤 Django 模型

Filter Django model based on other model

我有两个型号 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])

我需要根据两个条件从第一个模型 Wellinfo 中获取 WellID (ListaWells) 列表:

1-周长。

2- 如果 WellID 存在于第二个模型中 LOGRD_RPT

所以第一步是获取属于 Wellinfo 模型中的 Field='FD1' 的所有井

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 发布的方法如果有效的话会更好。 还有其他建议吗?