Re: what to do instead of adding to Query.extra_where ?
On Sep 3, 2:10 am, Steve Holdenwrote: > On 9/2/2010 1:44 AM, Paul Winkler wrote: > > > Hah. That was a pretty long message relative to how quickly I found > > the answer myself :-p > > Sorry for the noise. > > > For posterity, extra(where=...) is indeed the solution. I overlooked > > the obvious: > > the class I was trying to fix is itself a subclass of QuerySet. So > > given this line: > > > clone.query.extra_where += ('db_newsitem.id = > > db_attribute.news_item_id',) > > > the replacement is now: > > > clone = clone.extra(where=('db_newsitem.id = > > db_attribute.news_item_id',)) > > > Seems to work fine. > > [...] > > Once again this group proves itself at least as valuable as a stuffed > bear ;-) > > regards > Steve Steve - any chance you could translate that analogy into POE (Plain Old English)...?! Derek > DjangoCon US 2010 September 7-9http://djangocon.us/ -- You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-us...@googlegroups.com. To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-users?hl=en.
Re: what to do instead of adding to Query.extra_where ?
On 9/2/2010 1:44 AM, Paul Winkler wrote: > Hah. That was a pretty long message relative to how quickly I found > the answer myself :-p > Sorry for the noise. > > For posterity, extra(where=...) is indeed the solution. I overlooked > the obvious: > the class I was trying to fix is itself a subclass of QuerySet. So > given this line: > > clone.query.extra_where += ('db_newsitem.id = > db_attribute.news_item_id',) > > the replacement is now: > > clone = clone.extra(where=('db_newsitem.id = > db_attribute.news_item_id',)) > > Seems to work fine. > [...] Once again this group proves itself at least as valuable as a stuffed bear ;-) regards Steve -- DjangoCon US 2010 September 7-9 http://djangocon.us/ -- You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-us...@googlegroups.com. To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-users?hl=en.
Re: what to do instead of adding to Query.extra_where ?
Hah. That was a pretty long message relative to how quickly I found the answer myself :-p Sorry for the noise. For posterity, extra(where=...) is indeed the solution. I overlooked the obvious: the class I was trying to fix is itself a subclass of QuerySet. So given this line: clone.query.extra_where += ('db_newsitem.id = db_attribute.news_item_id',) the replacement is now: clone = clone.extra(where=('db_newsitem.id = db_attribute.news_item_id',)) Seems to work fine. On Sep 1, 11:41 pm, Paul Winklerwrote: > Hi folks, > > I'm working on a codebase (a fork ofhttp://code.google.com/p/ebcode/) > that is supposed to be run against Django 1.1. It has several lines > like this: > > clone.query.extra_where += ('db_newsitem.id = > db_attribute.news_item_id',) > > That line raises a traceback like this: > > Traceback (most recent call last): > File "./everyblock/everyblock/cities/boston/building_permits/ > retrieval.py", line 90, in > PermitScraper().update() > File "/home/pw/builds/openblock/builds/20100824/ebdata/ebdata/ > retrieval/scrapers/newsitem_list_detail.py", line 208, in update > super(NewsItemListDetailScraper, self).update() > File "/home/pw/builds/openblock/builds/20100824/ebdata/ebdata/ > retrieval/scrapers/list_detail.py", line 112, in update > self.update_from_string(page) > File "/home/pw/builds/openblock/builds/20100824/ebdata/ebdata/ > retrieval/scrapers/list_detail.py", line 140, in update_from_string > old_record = self.existing_record(list_record) > File "./everyblock/everyblock/cities/boston/building_permits/ > retrieval.py", line 65, in existing_record > qs = qs.by_attribute(self.schema_fields['raw_address'], > record['address']) > File "/home/pw/builds/openblock/builds/20100824/ebpub/ebpub/db/ > models.py", line 317, in by_attribute > clone = self.prepare_attribute_qs() > File "/home/pw/builds/openblock/builds/20100824/ebpub/ebpub/db/ > models.py", line 300, in prepare_attribute_qs > clone.query.extra_where += ('db_newsitem.id = > db_attribute.news_item_id',) > AttributeError: 'GeoQuery' object has no attribute 'extra_where' > > For more context, the relevant models.py code is > athttp://github.com/openplans/openblock/blob/master/ebpub/ebpub/db/mode... > and `clone.query` is an instance of > django.contrib.gis.db.models.sql.query.GeoQuery, which inherits from > the usual BaseQuery. > > Now, I've found by googling and downloading old releases that > django.db.models.sql.query.BaseQuery had an extra_where attribute as > of Django 1.0, but it's gone in Django 1.1. > And from looking at recent and old versions of the docs, I don't think > that extra_where was ever really part of the API; you're probably not > supposed to twiddle it directly. > > I haven't yet found a documented way to solve > this.http://docs.djangoproject.com/en/dev/ref/models/querysets/talks about > the .extra(where=...) method, > but that's part of the manager API and the QuerySet API, not the Query > API. > > The one thing I've found, by poking around in the django source, is to > call clone.query.where.add(ExtraWhere(...)) but it's not clear to me > whether that's really part of the API either. Is there a better / > "correct" way? > > Thanks, -- You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-us...@googlegroups.com. To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-users?hl=en.
what to do instead of adding to Query.extra_where ?
Hi folks, I'm working on a codebase (a fork of http://code.google.com/p/ebcode/) that is supposed to be run against Django 1.1. It has several lines like this: clone.query.extra_where += ('db_newsitem.id = db_attribute.news_item_id',) That line raises a traceback like this: Traceback (most recent call last): File "./everyblock/everyblock/cities/boston/building_permits/ retrieval.py", line 90, in PermitScraper().update() File "/home/pw/builds/openblock/builds/20100824/ebdata/ebdata/ retrieval/scrapers/newsitem_list_detail.py", line 208, in update super(NewsItemListDetailScraper, self).update() File "/home/pw/builds/openblock/builds/20100824/ebdata/ebdata/ retrieval/scrapers/list_detail.py", line 112, in update self.update_from_string(page) File "/home/pw/builds/openblock/builds/20100824/ebdata/ebdata/ retrieval/scrapers/list_detail.py", line 140, in update_from_string old_record = self.existing_record(list_record) File "./everyblock/everyblock/cities/boston/building_permits/ retrieval.py", line 65, in existing_record qs = qs.by_attribute(self.schema_fields['raw_address'], record['address']) File "/home/pw/builds/openblock/builds/20100824/ebpub/ebpub/db/ models.py", line 317, in by_attribute clone = self.prepare_attribute_qs() File "/home/pw/builds/openblock/builds/20100824/ebpub/ebpub/db/ models.py", line 300, in prepare_attribute_qs clone.query.extra_where += ('db_newsitem.id = db_attribute.news_item_id',) AttributeError: 'GeoQuery' object has no attribute 'extra_where' For more context, the relevant models.py code is at http://github.com/openplans/openblock/blob/master/ebpub/ebpub/db/models.py and `clone.query` is an instance of django.contrib.gis.db.models.sql.query.GeoQuery, which inherits from the usual BaseQuery. Now, I've found by googling and downloading old releases that django.db.models.sql.query.BaseQuery had an extra_where attribute as of Django 1.0, but it's gone in Django 1.1. And from looking at recent and old versions of the docs, I don't think that extra_where was ever really part of the API; you're probably not supposed to twiddle it directly. I haven't yet found a documented way to solve this. http://docs.djangoproject.com/en/dev/ref/models/querysets/ talks about the .extra(where=...) method, but that's part of the manager API and the QuerySet API, not the Query API. The one thing I've found, by poking around in the django source, is to call clone.query.where.add(ExtraWhere(...)) but it's not clear to me whether that's really part of the API either. Is there a better / "correct" way? Thanks, -- You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-us...@googlegroups.com. To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-users?hl=en.