No problem. If you are happy with the functionality, then keep it simple and go with what you know.
However, I would highly, highly recommend that you do not rely on system level packages for application development (such as those installed as .deb packages). I would move your entire project into a Python virtual environment and manage all package versions via pip. It is definitely worth a Google... If you have any plans to make it a long-standing project, future developers who look at your code will thank you. -James On Tue, Jan 6, 2015 at 1:08 PM, <[email protected]> wrote: > thank you for your answer, james. > > i had a quick look, but unfortunatly, both are not readily available as > .deb packages for python3, so i just just had some tries and came away with > the following solution. in the previously mentioned "removeEntry" method, i > changed the "with" block to the following: > > with transaction.atomic(): > if self.prev_entry == self.next_entry: > self.prev_entry.next_entry = self.prev_entry > self.prev_entry.prev_entry = self.prev_entry > self.prev_entry.save() > else: > self.prev_entry.next_entry = self.next_entry > self.prev_entry.save() > self.next_entry.prev_entry = self.prev_entry > self.next_entry.save() > self.next_entry = None > self.prev_entry = None > self.save() > self.delete() > > now it works as it should. i have a feeling that in the previous > version, when there where only 2 entries left, self.prev_entry.next_entry > and self.next_entry.prev_entry were different objects in django, although > they are the same database objects. > > best regards > > > tom > > > *Gesendet:* Dienstag, 06. Januar 2015 um 12:56 Uhr > *Von:* "James Schneider" <[email protected]> > *An:* [email protected] > *Betreff:* Re: prob. with non-related objects deleted > > This looks a lot like a basic MPTT tree. Have you looked at django-mptt or > django-treebeard? Either of those packages could probably save you a ton of > headache here, assuming that your lists contain all of the same type of > model, which it appears they do. > > > http://django-mptt.github.io/django-mptt/overview.html#what-is-modified-preorder-tree-traversal > > https://tabo.pe/projects/django-treebeard/docs/tip/ > > -James > On Jan 6, 2015 3:30 AM, <[email protected]> wrote: >> >> hello all, >> >> my problem is the following (the models.py is attached): >> i want to implement a double-linked list (type BasicEntry) with the first >> entry having an empty name. each entry has two attributes prev_entry and >> next_entry to its neigbours. the first entry is created automaticaly and >> should never be removed. upon removing the second to last entry (using the >> function removeEntry), the last entry is also removed, although i do not >> know why. i tracked it down to the "collect" function in "deletion.py" on >> line 190: >> >> for related in model._meta.get_all_related_objects( >> include_hidden=True, include_proxy_eq=True): >> >> do i misunderstand django or is this a known problem or "feature"? >> although i think i removed all references from the to be removed entry to >> the other entries... >> >> >> class BasicEntry(models.Model): >> name = models.CharField(max_length=10) >> entry_col = models.ForeignKey(EntryCollection) >> next_entry = models.ForeignKey('BasicEntry', related_name='next', >> null=True, default=None) >> prev_entry = models.ForeignKey('BasicEntry', related_name='prev', >> null=True, default=None) >> >> def addEntry(self, name): >> try_nr = 1 >> new_entry = None >> while True: >> try: >> with transaction.atomic(): >> new_entry = BasicEntry(name=name, >> entry_col=self.entry_col, >> next_entry=self.next_entry, >> prev_entry=self) >> new_entry.save() >> self.next_entry.prev_entry = new_entry >> self.next_entry.save() >> self.next_entry = new_entry >> if self.prev_entry == self: >> self.prev_entry = new_entry >> self.save() >> except IntegrityError as e: >> print('addEntry: try %d' %(try_nr)) >> try_nr += 1 >> if try_nr >= DB_Transaction_Tries: >> raise(e) >> time.sleep(DB_Transaction_sleep) >> else: >> break >> return(new_entry) >> >> def removeEntry(self): >> if self.name == '': >> print('** The "virtual" first track can not be removed!') >> return >> try_nr = 1 >> while True: >> try: >> with transaction.atomic(): >> self.prev_entry.next_entry = self.next_entry >> self.prev_entry.save() >> self.next_entry.prev_entry = self.prev_entry >> self.next_entry.save() >> self.next_entry = None >> self.prev_entry = None >> self.save() >> self.delete() >> except IntegrityError as e: >> print('removeEntry: try %d' %(try_nr)) >> try_nr += 1 >> if try_nr >= DB_Transaction_Tries: >> raise(e) >> time.sleep(DB_Transaction_sleep) >> else: >> break >> >> >> >> a few details: >> linux (debian amd64) >> python3 (v3.4.2-2) >> django (v1.7.1-1) >> >> here's an example in postgres: >> >> django=> select * from entry_test_basicentry order by id; >> id | name | entry_col_id | next_entry_id | prev_entry_id >> ----+-------+--------------+---------------+--------------- >> 33 | | 14 | 34 | 35 >> 34 | test1 | 14 | 35 | 33 >> 35 | test2 | 14 | 33 | 34 >> (3 rows) >> >> >> after removing ID 34: >> >> django=> select * from entry_test_basicentry order by id; >> id | name | entry_col_id | next_entry_id | prev_entry_id >> ----+-------+--------------+---------------+--------------- >> 33 | | 14 | 35 | 35 >> 35 | test2 | 14 | 33 | 33 >> (2 rows) >> >> >> after removing ID 35: >> >> django=> select * from entry_test_basicentry order by id; >> id | name | entry_col_id | next_entry_id | prev_entry_id >> ----+------+--------------+---------------+--------------- >> (0 rows) >> >> >> thanks in advance and best regards >> >> >> tom >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Django users" 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-users. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/django-users/trinity-29b3450f-f209-4d1d-8406-9f7ff205766a-1420541277592%403capp-gmx-bs67 >> . >> For more options, visit https://groups.google.com/d/optout. > > > -- > You received this message because you are subscribed to the Google Groups > "Django users" 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-users. > To view this discussion on the web visit > https://groups.google.com/d/msgid/django-users/CA%2Be%2BciWtP93C21m57dSi8c6HPnj88wgLnRZvdV3cFfJd8doG%3DQ%40mail.gmail.com > <https://groups.google.com/d/msgid/django-users/CA%2Be%2BciWtP93C21m57dSi8c6HPnj88wgLnRZvdV3cFfJd8doG%3DQ%40mail.gmail.com?utm_medium=email&utm_source=footer> > . > For more options, visit https://groups.google.com/d/optout. > > > > -- > You received this message because you are subscribed to the Google Groups > "Django users" 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-users. > To view this discussion on the web visit > https://groups.google.com/d/msgid/django-users/trinity-c7c508ec-96c8-4c56-a002-196fe4f22bc8-1420578529489%403capp-gmx-bs48 > <https://groups.google.com/d/msgid/django-users/trinity-c7c508ec-96c8-4c56-a002-196fe4f22bc8-1420578529489%403capp-gmx-bs48?utm_medium=email&utm_source=footer> > . > > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "Django users" 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-users. To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CA%2Be%2BciW-VaSL92dE3MR57VB7NW470ATa6%2BEsyz82rGyWWW6VBA%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.

