Thomas Thanks for replying
On 19/12/2012 12:06am, Thomas Orozco wrote:
Hi, Could you provide the following information? - What's the relationship between A and B (model code of the field, if there is, would be great)
There is no relationship at all. A and B are separately and independently related to Item.
A and B are actually copied from 'a' and 'b' which *are* related but exist purely as a stand-alone reference. When Item gets an A record (and it can have many) it is copied from its 'a' reference record. Item then automatically gets copies of all the corresponding 'b' reference records as B records - except duplicates are semi-skipped.
Where a duplicate would have occurred, I append the A_code into a special field on the B record to indicate which A records were/are "interested" in that B record. When A records are deleted, it is necessary to delete their corresponding B records - unless another A record is still interested in which case we just remove the deleted A_code from the special field.
I could send you the model code off-list if you wish.
- The code of your pre_delete signal handler / the method it calls.
# this lives in models.A_Part.py # # # from django.db.models.signals import pre_delete, post_delete def cleanup_bparts(sender, instance, **kwargs): instance.item.delete_bparts(a_code=instance.a_code) pre_delete.connect(cleanup_bparts, sender=A_Part, weak=False) #post_delete.connect(cleanup_bparts, sender=A_Part, weak=False) # # # # # # # # # # # # ... and the item.delete_bparts() code ... def delete_bparts(self, a_code): qs_bpart = B_Part.objects.filter(item=self, a_partcodes__contains=a_code) for bpart in qs_bpart: acodes = bpart.a_partcodes.split() if len(acodes) == 1: bpart.delete() else: acodes.remove(a_code) bpart.a_partcodes = ' '.join(acodes) bpart.save()
I think you have a ForeignKey field that is required or limited and that is causing the ValidationError. Indeed, that line 988 is in the code for ModelChoiceField
I have been through all the fk fields and they are all null=True, blank=True and in Postgress each _id column is nullable.
I also had an ordering sequence on some of the models and I removed all that as well.
As mentioned earlier, embedded print statements seem to prove the delete_bparts() code is working nicely.
When I comment out the pre-delete connection, the A_Part record gets delete as expected - but obviously it doesn't clean up the B records.
Thanks .... Mike
Best, Thomas 2012/12/17 Mike Dewhirst <mi...@dewhirst.com.au <mailto:mi...@dewhirst.com.au>> I'm getting a baffling ValidationError. Request URL: http://127.0.0.1:8000/admin/__assembly/item/4/ <http://127.0.0.1:8000/admin/assembly/item/4/> Django Version: 1.4.3 Exception Type: ValidationError Exception Value: [u'Select a valid choice. That choice is not one of the available choices.'] Exception Location: C:\usr\bin\lib\site-packages\__django\forms\models.py in to_python, line 988 Python Version: 2.7.3 Background ... I have an Item model which has two one-to-many relationships with other types of child records (call them A and B models). In the Admin, when the user adds an A record, some B records get added automatically. The next A record to get added does much the same but if there are any B duplicates it doesn't try to add those but instead just adds its mark to a special field in the B record which is already there. My code - which from embedded print statements appears to be doing exactly what I want - will either delete the B record or just remove the mark previously added. Eventually when the last A record is deleted the idea is that the last B records will go at the same time. Unfortunately, at the final hurdle we get the ValidationError at line 988 in to_python. The local vars nominate ... self <django.forms.models.__ModelChoiceField object at 0x00F5DE70> value u'251' key 'pk' ... and that is the pk of the A record which triggers the Item code via a pre_delete signal. Summarising: - the deletion/mark removal method lives in the Item model - the pre-delete signal is detected in the A record - the signal connects a stub method in the A record - the stub method in the A record calls the Item method - the Item method iterates over a filtered queryset of B records and uses the passed value (the aforesaid mark from the A record) to decide whether to delete the B record or just remove the mark and save it None of my code appears in the TraceBack so I assume the Admin is trying to delete the A record. I've tried both pre_delete and post_delete signals in the A record. Why is it so? Thanks for any hints Mike -- You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-users@googlegroups.com <mailto:django-users@googlegroups.com>. To unsubscribe from this group, send email to django-users+unsubscribe@__googlegroups.com <mailto:django-users%2bunsubscr...@googlegroups.com>. 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 django-users@googlegroups.com. To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com. 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 django-users@googlegroups.com. To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-users?hl=en.