1. 联表查询
1.联表并取两表字段
from django.db.models import Exists, OuterRef
DataTickets.objects.filter(
create_time__gte=start_time,
create_time__lte=end_time,
).values('requestor_id',
xx=BizUserGroupResult.objects.filter(customer_id=OuterRef('requestor_id')).values('xx'))
DataTickets.objects.filter(
create_time__time__gte=start_time,
create_time__time__lte=end_time).extra(
select={
'is_rest': f"select is_rest from {BizBsFeature._meta.db_table} where is_rest=Date({DataTickets._meta.db_table}.create_time)"
}
).values('create_time__date', 'is_rest')
aa = DataCustomer.objects.filter(customer_id__in=similar_users,cell_phone=OuterRef('cell_number')
DataPhone.objects.filter(Exists(aa))).annotate(call_id_=Subquery(aa).values('customer_id')))
2.联表只取主表字段
from django.db.models import Exists, OuterRef
DataTickets.objects.filter(
Exists(
BizUserGroupResult.objects.filter(
group_base_id=instance.group_base_id,
customer_id=OuterRef('requestor_id'))
),
create_time__gte=start_time,
create_time__lte=end_time,
).values_list('requestor_id', flat=True)
2. select_related与prefetch_related
from django.db.models import OuterRef, Subquery, F, Count, Prefetch, Exists
from seqauto_cn.models import SequencingProject, Aggregation, Analysis
from seqauto_cn.models.processing_environment import get_bu_environment
from seqauto.models import SequencedSample, Sample
success_aggregation = Aggregation.objects.filter(
related_analysis__analysis_params__project__sequencing_project__id=OuterRef('pk'), state='FINISHED')
allowed_sequencing_project = SequencingProject.objects.annotate(
has_success_aggregation=Exists(success_aggregation)
).filter(has_success_aggregation=True).select_related(
'user',
'analysis_params__sequencing_analysis_params',
).prefetch_related(
'analysis_params__analysis_set',
'sample_set',
Prefetch(
'sample_set',
queryset=Sample.objects.select_related('sequenced_sample'),
to_attr='prefetched_sample'
),
Prefetch(
'analysis_params__analysis_set__aggregation_set',
queryset=Aggregation.objects.all(),
to_attr='prefetched_aggregation'
)
)
for project in allowed_sequencing_project:
project.user.username
project.analysis_params.sequencing_analysis_params
for i in project.analysis_params.analysis_set.all():
pass
for i in project.sample_set.all():
pass
project.prefetched_sample
for i in project.prefetched_aggregation.all():
pass