Join query in Django
If we have two tables, virulence_genome and virulence_cds, and their schemas are as following:
Table "public.virulence_genome"
Column | Type | Collation | Nullable | Default
------------------+-----------------------+-----------+----------+---------
genome_id | integer | | not null |
accession_number | character varying(50) | | not null |
strand | integer | | not null |
start_position | integer | | not null |
end_position | integer | | not null |
location | character varying(20) | | not null |
Table "public.virulence_cds"
Column | Type | Collation | Nullable | Default
-------------+---------+-----------+----------+---------
genome_id | integer | | not null |
gene | text | | not null |
locus_tag | text | | not null |
note | text | | not null |
product | text | | not null |
cds_db_xref | text | | not null |
genome_id in virulence_cds is a foreign key of virulence_genome.
What if we want to get gene names and their locations for genes that are not located on genome?
Use sql query we could write something like:
select vc.gene,vg.location from virulence_cds vc join virulence_genome vg on vc.genome_id = vg.genome_id and vg.location !='genome';
What to do in Django view? I have propsed two ways to do it. Obvisouly one way is better than the other.
So to find all CDs which are not located at genome, we could write:
def func(request):
genome_ids=Genome.objects.filter(location='plasmid').values_list('genome_id')
return Cds.objects.select_related('genome').filter(~Q(genome_id__in=genome_ids))
or
def func(request):
return Cds.objects.select_related('genome').filter(~Q(genome__location='plasmid'))
No comments:
Post a Comment