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.

Reply via email to