django - Swapping values in a OneToOneField: IntegrityError -


i have following object:

from django.db import models  class page(models.model):     prev_sibling = models.onetoonefield('self', related_name='next_sibling',                                         null=true, blank=true) 

i have several instances of these objects. let's say, a, b, c , d. have assigned sibling relationships such a has b prev_sibling, , c has d prev_sibling.

now imagine want swap b , d around. re-assign attributes, follows:

a.prev_sibling = d a.save() c.prev_sibling = b c.save() 

however, fails integrityerror, no longer satisfy uniqueness constraint implied onetoonefield after first save().

i tried wrapping code in transaction, hoping that make sure save occur atomically, , prevent temporary constraint breach, so:

from django.db import transaction  transaction.atomic():     a.prev_sibling = d     a.save()     c.prev_sibling = b     c.save() 

but did not work. right way resolve this?

edit: record: tried sequentially assigning , saving (as follows), 1 might expect, behaviour no different.

with transaction.atomic():     a.prev_sibling = d     c.prev_sibling = b     a.save()     c.save() 

you're violating database constraints. need clear other 1 before save database in 'valid' state. granted, after set them none, it's not technically desired state, it's valid 1 database constraints.

this should work you, risk losing relationship if bad happen between saving them none , setting properties.

page.objects.filter(id__in=[a.id, c.id]).update(prev_sibling=none) a.prev_sibling = d a.save() c.prev_sibling = b c.save() 

Comments

Popular posts from this blog

Fail to load namespace Spring Security http://www.springframework.org/security/tags -

sql - MySQL query optimization using coalesce -

unity3d - Unity local avoidance in user created world -