基于其他模型过滤 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 发布的方法如果有效的话会更好。
还有其他建议吗?
我有两个型号 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 发布的方法如果有效的话会更好。 还有其他建议吗?