Howdy --

Russ, I can't thank you enough for your work on this stuff.  Half  
these edge cases I wouldn't have even thought of 'til they bit me in  
the ass -- I really appreciate it :)

Now, onto your questions:

> I propose that: 'Article.reporter_set = X' be allowed, where X is any
> iterable. The assignment results in the relation set being cleared and
> replaced with all items in X.

+1; this is clear and concise.  Kieren's objection about the  
implication of ordering is a valid one, but I think most Python  
developers are comfortable with the idea of different types of  
iterables behaving differently.  This also allows such constructions  
as::

        Article.reporter_set = Reporter.objects.filter(...)

Which "feels right" to me.

> Rather than allowing
> any iterable or single object, only allow sets on the assignment.

I'm -0 on this; seems too restrictive, and since the use will usually  
be to construct a throwaway set from a list, let's just allow the list.

> 2) If a related attribute currently has a value of None, should the
> __get__ method return None, or raise a DoesNotExist if accessed? Does
> this behaviour change if the attribute is set null=True?

I think that if the foreign key is None (for whatever reason), then  
__get__ should return None; otherwise it should expect a valid  
reference to exist and raise DoesNotExist.  (For template authors,  
note that DoesNotExist exceptions are swallowed silently by the  
template engine so you don't have to worry about being bitten by this).

My reasoning is that if I do::

        article.reporter_id = some_non_existant_id
        print article.reporter

I should get an exception, but if I construct a Article with an empty  
(i.e. None) reporter_id, I should get None.

> 3) What is to become of the _id fields for ForeignKeys?

They need to stay around for efficiency; I'd like not to have to do a  
db hit just to find the id of something I've already got.  Often in  
bulk-data-import situations you have the need to monkey with ids, and  
the few db hits the better.

> This bit me recently because a1.reporter_id = r.id is still legal
> syntax, but doesn't update/flush the cache for a1.reporter.id. If _id
> is to be retained, how is single object descriptor caching to be
> handled to avoid this sort of problem?

I'm not sure this is solvable; I'd say that if people set ids  
manually they need to remember to call ``save()``.

> 4) Reverse descriptors and save() have an interesting relationship.
[snip]
> a) make add()/remove()/clear()/__set__ implicit save points. This
> would have the added bonus of making ForeignKey add() etc mirror
> ManyToMany add() behaviour (since m2m table additions occur
> immediately, where ForeignKey add()'s are not applied until save() on
> the underlying objects)

Like hugo, I like this approach, and for all the same reasons he  
gave.  However, I'd say I'm +0.9 -- if there's a better solution I'd  
like to have it, but damned if I can think what it might be.

Jacob

--~--~---------~--~----~------------~-------~--~----~
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 [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-developers
-~----------~----~----~----~------~----~------~--~---

Reply via email to