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 django-users+unsubscribe@**
> googlegroups.com <django-users%[email protected]>.
> For more options, visit this group at http://groups.google.com/**
> group/django-users?hl=en<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.