> > Please do elaborate on this. AFAIK FKs in filter() work just fine, so
> > if there's something broken we should know about it right away.
> 
> I found ticket 2076, but that only concerns order_by().
> 
> I haven't got access to my code at the moment.

Ok, I got hold of my code.

Of course (I had a feeling that this was going to happen), the only places I
can find where I couldn't get filtering to work are where I'm doing
something that is probably too complex to do with SQL (although I'm no SQL
expert).

Here's the function I ended up with after trying to get it going with
filter() :
def exception_age(request, year_filter):
    """Lists cadets that might not be the right age for the course they
applied for."""
    this_june = date(int(year_filter), 6, 1)
    this_sept = date(int(year_filter), 9, 1)
    apps = list(Application.objects.filter(year=year_filter))
    # filter out any that are definitely the right age
    apps = [a for a in apps if (a.cadet.age_on(this_june) <
float(a.camp.min_age)) or (a.cadet.ages_out() < this_sept)]

I don't have the filter() versions that I tried along the way, but it was
based on comparing the application.cadet.date_of_birth field.

This one involves comparing the values in two tables :
def exception_eligibility(request, year_filter):
    """Lists cadets not in the right level for the course they applied
for."""
    apps = list(Application.objects.filter(year=year_filter))
    # filter out any that are in the right level
    apps = [a for a in apps if a.training_level < a.camp.min_training_level]
    # Sort the list by squadron number
    apps.sort(key=sqn_of_app);
    return render_to_response('camps/exception_eligibility.html',
{'object_list' : apps,})

and this one requires doing a calculation on the difference between two
fields (cadet.date_of_birth and cadet.enrollment_date) :
def exception_enrollment(request, year_filter):
    """Lists cadets enrolled too young who've applied this year."""
    apps = list(Application.objects.filter(year=year_filter))
    # filter out any that joined old enough
    cdts = [a.cadet for a in apps if a.cadet.age_at_enrollment() < 12]
    # Sort the list by squadron number
    cdts.sort(key=sqn_of_cdt);
    return render_to_response('camps/exception_enrollment.html',
{'object_list' : cdts,})

I do  have examples of where order_by doesn't work. Here's one :
def wing(app):
    return app.cadet.sqn.wing.name

def camp_csv(request, year_filter, object_id):
    [...]
    app_list = list(camp.application_set.filter(year=year_filter))
    # Sort by wing
    app_list.sort(key=wing)
#    app_list =
camp.application_set.filter(year=year_filter).order_by('camps_application__c
adet.sqn.wing.name')
    [...]

You can see where I've commented-out what I wanted to do. The commented-out
version gives :
Exception Type:         OperationalError
Exception Value:        (1054, "Unknown column
'camps_application__cadet.sqn.wing.name' in 'order clause'")

This is following a series of foreign keys (application belongs to cadet,
belongs to sqn, belongs to wing).

Chris




--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-users@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to