Hi everyone,

I apologise for the verbosity of this message - for my first post it's
quite long.

I am currently working on my first project employing the Sites
framework, and have been moving along quite well with the
documentation until I hit a snag last night.

I have overloaded the default manager in my model to use a slight
variant of the CurrentSiteManager, shown below.

class MyCurrentSiteManager(models.Manager):
  def __init__(self, field_name='site'):
    super(MyCurrentSiteManager, self).__init__()
    self.__field_name = field_name
  def get_query_set(self):
    return super(MyCurrentSiteManager,
self).get_query_set().filter(**{self.__field_name + '__id__exact':
settings.SITE_ID})

The reason I've trimmed it down, is because I want field_name to be a
site reference on a related model. such as:

class Venue(models.Model):
  name = models.CharField(max_length=50)
  site = models.ForeignKey(Site)
  objects = MyCurrentSiteManager()
  systemwide = models.Manager()

class Conference(models.Model):
  title = models.CharField(max_length=50)
  venue = models.ForeignKey(Venue, related_name='conferences')
  objects = MyCurrentSiteManager('venue__site')
  systemwide = models.Manager()

What I am seeing is that the following queries work and present only
the objects which are on the site (Venue) or objects which are related
to a Venue on the site (Conference):

Venue.objects.all()
Conference.objects.all()

However, if I try to get the related objects of a Venue object, I get
an error as below:

>>> v = Venue.objects.get(pk=1)
>>> v.conferences.all()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/lib/python2.5/site-packages/django/db/models/manager.py",
line 78, in all
    return self.get_query_set()
  File "/usr/lib/python2.5/site-packages/django/db/models/fields/
related.py", line 300, in get_query_set
    return
superclass.get_query_set(self).filter(**(self.core_filters))
  File "/path/munged/managers.py", line 14, in get_query_set
    return super(MyCurrentSiteManager,
self).get_query_set().filter(**{self.__field_name + '__id__exact':
settings.SITE_ID})
  File "/usr/lib/python2.5/site-packages/django/db/models/query.py",
line 483, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "/usr/lib/python2.5/site-packages/django/db/models/query.py",
line 501, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File "/usr/lib/python2.5/site-packages/django/db/models/sql/
query.py", line 1224, in add_q
    can_reuse=used_aliases)
  File "/usr/lib/python2.5/site-packages/django/db/models/sql/
query.py", line 1099, in add_filter
    negate=negate, process_extras=process_extras)
  File "/usr/lib/python2.5/site-packages/django/db/models/sql/
query.py", line 1287, in setup_joins
    "Choices are: %s" % (name, ", ".join(names)))
FieldError: Cannot resolve keyword 'site' into field. Choices are:
venue, id, title

I added a print line to my manager's get_query_set method, so it now
reads:

  def get_query_set(self):
    print self.model._meta.object_name, self.__field_name
    return super(MyCurrentSiteManager,
self).get_query_set().filter(**{self.__field_name + '__id__exact':
settings.SITE_ID})

When I redo the query above, I now get:

>>> v.conferences.all()
Venue site
Conference site
Traceback (most recent call last):
... as before ...

I was expecting it to be:

>>> v.conferences.all()
Venue site
Conference venue__site
<QuerySet>

So my analysis is that the RelatedManager (v.conferences) is not
completely partnering up with my MyCurrentSiteManager because,
although the print statements are firing off, they are not actually
using the field_name parameter I supplied when instantiating the
manager on the model.

And here we are, finally at my question!  Is it possible to have the
related manager use the field_name that was passed in to my custom
manager?

Again, sorry for the long post but I thought it best to lay it all out
there first!

Regards,
Gary
--~--~---------~--~----~------------~-------~--~----~
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