On Sun, May 12, 2013 at 8:10 AM, Andrew Ingram <[email protected]>wrote:
> On 12 May 2013, at 00:55, Russell Keith-Magee <[email protected]> > wrote: > > I'm sure I understand this argument. Python objects are passed around by > reference, not by value, so if you've passed in a Django object deep into > another library, that library will be pointing at the same instance. If the > instance is changed, everywhere holding a handle to that reference will be > updated. > > To that end - I want to make sure that we're clear about what we're > talking about here. > > What is on the table is essentially adding a refresh() call on an object > instance that is an API analog of ".get(id=self.id)" (although the > implementation will need to do a bit more than that). > > We are *not* talking about ticket #17, object instance caching. Calling > refresh() *will not* update *every* instance of a given object. The > following would be the effective API: > > >>> a = MyObj.objects.get(id=42) > >>> a.message = 'hello' > >>> a.save() > >>> b = MyObj.objects.get(id=42) > >>> c = MyObj.objects.get(id=42) > > >>> a.message = 'goodbye' > >>> a.save() > >>> print b.message > 'hello' > >>> b.refresh() > >>> print b.message > 'goodbye' > >>> print c.message > 'hello' > > > I was under the impression that the suggested use case was more like this: > > >>> a = MyObj.objects.get(id=42) > >>> a.message = 'hello' > >>> b = {'obj': a} > >>> print b['obj'].message > 'hello' > >>> c = MyObj.objects.get(id=42) > >>> c.message = 'goodbye' > >>> c.save() > >>> a = MyObj.objects.get(id=42) # existing 'workaround', gives us a new > instance > >>> print a.message > 'goodbye' > >>> print b['obj'].message # b['obj'] still points to the original > instance `a` > 'hello' > > If a reload() method existed, `a` could have been reloaded with > `a.reload()`, and then `b['obj']` would have been up-to-date as well. As it > stands, every reference to `a` has to be explicitly re-fetched from the > database. > > Am I missing something obvious? > > As far as I can make out, that's exactly the same use case -- you're just making the example a little bit more explicit regarding the fact that 'a' is an object referred to by reference, so if 'a' is updated, b['a'] will also be updated. The point I was trying to make is that we're *not* talking about every instance of "object with PK 42" being transparently updated. It's an explicit API call on a specific object instance. Russ %-) -- You received this message because you are subscribed to the Google Groups "Django developers" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/django-developers?hl=en. For more options, visit https://groups.google.com/groups/opt_out.
