Joel G Mathew
Joel G Mathew

Reputation: 8061

Unexpected behavior on delete of a model row

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 bidirectional 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?

Edit: What I need is, when a profile pic linked to a doctor is deleted, the doctor's pic be set to null(SETNULL?), but when a doctor is deleted, both doc and pic should be deleted(CASCADE?).

Upvotes: 0

Views: 29

Answers (1)

Amine Messaoudi
Amine Messaoudi

Reputation: 2279

Change

pic.delete()

To

pic.file.delete()

EDIT :

Change

profilepic = models.ForeignKey(DoctorProfilePic, blank=True, null=True, on_delete=models.CASCADE)

To

profilepic = models.ForeignKey(DoctorProfilePic, blank=True, null=True, on_delete=models.DO_NOTHING)

Upvotes: 1

Related Questions