You’ll want to review this reference:
https://docs.djangoproject.com/en/2.1/ref/models/fields/#django.db.models.ForeignKey.on_delete

You probably want the option on doc to be SET_NULL.

Actually, I suggest some overall cleanup.
Your model names should follow a standard convention.  Django practices the 
camel case convention.  (CamelCase)
Also, you have a ForeignKey where you probably just want a OneToOneField.
Use related_name to have a reverse relationship.  In my proposal below, you can 
access the profile picture just like you could before.
I would have just let Django handle the primary key field without changing the 
name of it.

doctor.profile_pic

    class Doctor(models.Model):
        name = models.CharField(max_length=35)
        username = models.CharField(max_length=15)

    class DoctorProfilePic (models.Model):
        name = models.CharField(max_length=255, blank=True)
        pic = StdImageField(upload_to="data/media/%Y/%m/%d", blank=True, 
variations={
            'large': (600, 400),
            'thumbnail': (150, 140, True),
            'medium': (300, 200),
        })
        doctor = models.OneToOneField(Doctor, blank=True,
                                null=True, on_delete=models.SET_NULL, 
related_name="profile_pic")


…and after saying all that, I wouldn’t make a separate model for the profile 
picture.  This is what I would do:
    class Doctor(models.Model):
        name = models.CharField(max_length=35)
        username = models.CharField(max_length=15)
        profile_pic = StdImageField(upload_to="data/media/%Y/%m/%d", 
blank=True, variations={
            'large': (600, 400),
            'thumbnail': (150, 140, True),
            'medium': (300, 200),
        })



From: [email protected] [mailto:[email protected]] On 
Behalf Of Joel Mathew
Sent: Tuesday, November 27, 2018 12:24 PM
To: [email protected]
Subject: Unexpected behavior on delete of model

Situation:

I have two Model classes, in two different apps which are part of the same 
project. class doctor defined in appointments.models is a set of attributes 
associated with a doctor, like name, username, email, phone etc. class 
DoctorProfilePic is a Model defined in clinic.models, which has a StdImageField 
which stores images. doctor has a One to One mapping to DoctorProfilePic.

    class doctor(models.Model):
        docid = models.AutoField(primary_key=True, unique=True) # Need 
autoincrement, unique and primary
        name = models.CharField(max_length=35)
        username = models.CharField(max_length=15)
        ...
        profilepic = models.ForeignKey(DoctorProfilePic, blank=True, null=True, 
on_delete=models.CASCADE)
        ...

    class DoctorProfilePic (models.Model):
        id = models.AutoField(primary_key=True, unique=True)
        name = models.CharField(max_length=255, blank=True)
        pic = StdImageField(upload_to="data/media/%Y/%m/%d", blank=True, 
variations={
            'large': (600, 400),
            'thumbnail': (150, 140, True),
            'medium': (300, 200),
        })
        doc = models.ForeignKey('appointments.doctor', blank=True,
                                null=True, on_delete=models.CASCADE)

Anticipated response:

When user selects one of the profile pics from a selection box, and clicks 
Delete, django is supposed to delete the picture from the collection of 
pictures uploaded by the doctor.

Problem:

When the delete button is clicked, django deletes both the picture and the 
doctor, instead of just the former.

Code:

    def removeprofpic(request, docid):
        docid = int(docid)
        if not IsOwnerorSuperUser(request, docid):
            return HttpResponse("You dont have permissions to do this.")
        doc = doctor.objects.get(docid = docid)
        if request.method == 'POST':
            print(request.POST)
            picid = int(request.POST.get('profilepic'))
            print(f'doc:{doc} picid:{picid}')
            pic = DoctorProfilePic.objects.get(doc = doc, id =picid)
            pic.delete()
            msg = f"Successfully removed profile picture."
        else:
            msg = "Not a valid POST"
        return HttpResponse(msg)

Now I'm guessing my problem is in defining the on_delete=models.CASCADE? Can 
someone explain what I've done wrong?
Sincerely yours,
 Joel G Mathew

--
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]<mailto:[email protected]>.
To post to this group, send email to 
[email protected]<mailto:[email protected]>.
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/CAA%3Diw__vyDXxz6sfmcS_Bcy8M5cANmB7mwmTMwS4rfF96bJmbg%40mail.gmail.com<https://groups.google.com/d/msgid/django-users/CAA%3Diw__vyDXxz6sfmcS_Bcy8M5cANmB7mwmTMwS4rfF96bJmbg%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 https://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/360df97b2ca14af69267bd6e98436ac6%40iss2.ISS.LOCAL.
For more options, visit https://groups.google.com/d/optout.

Reply via email to