On Fri, Sep 4, 2009 at 6:30 AM, Ben Davis<bendavi...@gmail.com> wrote: > Hi I've submitted a patch for this bug that I'd like to have considered for > some trunk action... I can't take the credit for all the work on this, but > it seems I'm taking the initiative to get it resolved.
... which is exactly what is needed. Having patches is great, but what we really need is people willing to engage the core and the development community over the long run to see fixes like this one home. Persistence will be required :-) > I really only had one question about a particular change that was needed in > order for the .values() query to work with reverse one-to-one (e.g., > User.objects.values('username', 'userprofile__zip') ) . It looks like > mtredinnick wrote the original code for this that was modified. The change > was fairly simpe, In the setup_joins function in db/models/sql/query.py: > > --- > > raise FieldError("Cannot resolve keyword %r into field. > " > "Choices are: %s" % (name, ", ".join(names))) > > > - if not allow_many and (m2m or not direct): > + if not allow_many and m2m: > for alias in joins: > self.unref_alias(alias) > raise MultiJoin(pos + 1) > > > --- > > Looking at the original code, I'm not sure why "indirect" fields were not > allowed if they weren't many-to-many relationships. This is basically what > was keeping the reverse one-to-one lookups from working. I'm not 100% sure > of the consequences of this change, but all model tests seemed to pass with > this change. > > thoughts? My immediate thought is that the effect of the (m2m or not direct) logic is to remove the 'many' sides of fields from consideration. The comparison you're looking at is operating on data that comes from line 1725: field, model, direct, m2m = opts.get_field_by_name(name) In this contect, 'field' can be one of 5 things: 1. Natural fields (charfield) 2. ForeignKey fields (the local end) 3. OneToOneFields (the local end) 4. ManyToManyField (the local end) 5. RelatedObject (the remote 'many' end of a FK, or the remote end of an m2m) 6. RelatedObject (the remote end of a OneToOne Field) (1) is not of interest here. select_related() currently works with (2) and (3). These are the values where direct=True (since they are locally defined) but m2m is False. (4) always returns m2m; (5) and (6) always return direct=False. (6) is the case you're trying allow, but you can't do so at the expense of excluding (5). The fact that the tests don't fail when you make this change is promising. (I presume your statement about model tests includes the regression tests too, not just the modeltest directory) However, there's no particular guarantee of branch coverage in Django's test suite. Just be sure, my suggestion here it to try and be pathological. Work your way backwards from that if statement, and try to work out what set of models will cause that join condition to be invoked. Essentially, try to reverse engineer the test case that will fail if you modify that line. If it turns out to not be possible, then explain why; if it is possible, then you need to either find another way to manufacture the join you need. Yours, Russ Magee %-) --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Django developers" group. To post to this group, send email to django-developers@googlegroups.com To unsubscribe from this group, send email to django-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/django-developers?hl=en -~----------~----~----~----~------~----~------~--~---