[CentralOH] Reinventing the Wheel: Counting References in Django

jep200404 at columbus.rr.com jep200404 at columbus.rr.com
Sat Dec 8 07:26:17 CET 2012

What are the standard ways of counting references in Django? 

I get the feeling that I'm reinventing the wheel below; 
that there's likely some standard way of counting references. 

On Thu, 6 Dec 2012 19:43:23 -0500, jep200404 at columbus.rr.com wrote:

> In Django, what's a better way of counting references to a record 
> of an arbitrary model than my following working code? 
>     c = 0
>     for r in record._meta.get_all_related_objects():
>         c += r.model.objects.filter(
>             **{r.field.name + '__exact': record.id}).count()

That pattern and variations of it appeared several times, 
so I put the code in functions below. The code above would be 
replaced with just c = count_references(previous). 

def count_particular_references(record_or_model, query_keyword_suffix, target):
    c = 0
    for f in record_or_model._meta.get_all_related_objects():
        c += f.model.objects.filter(
            **{f.field.name + query_keyword_suffix: target}).count()
    return c

def count_references(record):
    return count_particular_references(record, '__exact', record)

Imagine one has a File model with information about an actual 
file. Also, one has Book, Magazine, and Flyer models, each of which 
have a ForeignKey pointing to a record in the File model. 
For a given row of File, named file_info, one can find out 
how many other records in the various tables refer to file_info, 
with the following: 


If one wants to know how many records refer to File records 
that have a particular sha1sum value, one could do: 

    count_particular_references(File, '__sha1sum__exact', sha1sum)

More information about the CentralOH mailing list