Yes,

it is the same thing.  What I wonder is if there is a standard or better way
of getting the same functionality as my full_save method?

Regards
David



2011/8/19 Yaşar Arabacı <[email protected]>

> I don't quite understand what you did there, but, it seems to me it is the
> same thing with your initial post.
>
> ref = getattr(self, f.name) -> you are getting a field here, this field is
> a empty descriptor, doesn't hold any data yet.
> ref.full_save(*args,*kwargs) -> you populated your field with data here by
> calling full_save on it
> setattr(self,f.name,ref) -> you are assigning this field to be a part of
> parent object, where you got it initially
>
> then you are saving the parent object.
>
>
>
>
>
> 2011/8/19 David Jacquet <[email protected]>
>
>>
>> Thanks Yaşar and Jani for your fast replies!
>>
>>
>> I understand that normally one would assign in the reverse order. However
>> I do not understand exactly what happens when I do
>> meeting.place = meeting.place
>> never in my programming experience have I seen an example when
>> x=x
>> really does something. Isn't this strange?
>>
>>
>> Anyway, the reason for me wanting to go around normal behavior is that I
>> have a quite complicated and nested datamodel. Then I offer an api where
>> people can post JSON object. The will posts will be heavily nested ojbects
>> and I do not want save it to db by rewriting the whole save-chain in my
>> code. I have solved this by creating the class AREM below. When I have a
>> dictionary d representing a class A (subclass to AREM) and I want it saved I
>> do:
>>
>> a = A().from_dict(d)
>> a.full_save()
>>
>> I have gotten it to work, but not before I added the (for me very strange)
>> row
>>
>> setattr(self, f.name, ref) #Without this everything collapses
>>
>> residing on the second most bottom row in the code below. The problem is
>> that I do not know what it does, nor if there is a more elegant, faster or
>> better way to do it.
>>
>> Best Regards
>> David
>>
>>
>>
>> #class AbstractRecursiveEnabledModel(models.Model):
>> class AREM(AMCS):
>>     class Meta:
>>         abstract = True
>>
>>     def from_dict(self, d):
>>         if not isinstance(d, dict):
>>             return d
>>         fl = self._meta.fields
>>         for f in fl:
>>             if d.has_key(f.name) and f.rel and d[f.name] is not None:
>>                 d[f.name] = f.rel.to().from_dict(d[f.name])
>>         self.__init__(**d)
>>         return self
>>
>>     def full_save(self,*args, **kwargs):        fl = self._meta.fields
>>
>>         for f in fl:
>>             if f.rel:
>>                 ref = getattr(self, f.name)
>>                 if ref is not None and ref.pk is None and ref is not
>> self:
>>                     ref.full_save(*args, **kwargs)
>>                 setattr(self, f.name, ref) #Without this everything
>> collapses
>>         super(AREM, self).save(*args, **kwargs)
>>
>>
>>
>>
>>
>>
>>
>> On Fri, Aug 19, 2011 at 2:34 PM, Jani Tiainen <[email protected]> wrote:
>>
>>> On 08/19/2011 03:15 PM, Jacco wrote:
>>>
>>>> I am having great difficulties in saving nested models in an easy
>>>> way.
>>>>
>>>>
>>>> #Two (almost) identical functions:
>>>> def test1():
>>>>     place = Place(where='Paris')
>>>>
>>>
>>> place is not saved, thus it does not have a primary key (id)
>>>
>>>
>>>      meeting = Meeting(place=place, when='2011-01-01')
>>>>
>>>
>>> You assign non saved instance to a meeting. Probably what happened
>>> internally is that place.pk is copied to meeting.place_id.
>>>
>>>      place.save()
>>>>
>>>
>>> You saved place. Changes in model are not reflected to referred model.
>>>
>>>      meeting.save()
>>>>
>>>
>>> You save meeting with still (partially) stale place pk. thus resulting an
>>> exception.
>>>
>>>
>>>  def test2():
>>>>     place = Place(where='Paris')
>>>>     meeting = Meeting(place=place, when='2011-01-01')
>>>>
>>>>     place.save()
>>>>     meeting.place = meeting.place      #BY setting meeting.place to
>>>> itself, it works !!!!!!!!!!!!
>>>>
>>>
>>> You updated your meeting internal structure.
>>>
>>>      meeting.save()
>>>>     return meeting
>>>>
>>>> ----------------------------------------------------------------------------------------------------------------------------------------------
>>>>
>>>>
>>>>
>>>> - Running test1() results in crash "null value in column "place_id"
>>>> violates not-null constraint"
>>>> - Running test2() results in OK.
>>>> - Only difference is the dummy line "meting.place = meeting.place".
>>>>
>>>> Could someone who really understands this explain what is going on?
>>>>
>>>>
>>> What's going on that you have done it incorrect order.
>>>
>>> place = Place(where='Paris')
>>> place.save() # Place saved, PK assigned.
>>>
>>>
>>> meeting = Meeting(place=place, when='2011-01-01')
>>> meeting.save() # Meeting saved with correct place.
>>>
>>> --
>>>
>>> Jani Tiainen
>>>
>>> --
>>> You received this message because you are subscribed to the Google Groups
>>> "Django users" group.
>>> To post to this group, send email to [email protected].
>>> 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.
>>>
>>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "Django users" group.
>> To post to this group, send email to [email protected].
>> 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.
>>
>
>  --
> You received this message because you are subscribed to the Google Groups
> "Django users" group.
> To post to this group, send email to [email protected].
> 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.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to [email protected].
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