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.