Yes, thank you, Todor. Yesterday night, I ended up doing exactly this. Sincerely yours,
Joel G Mathew On Wed, 28 Nov 2018 at 12:46, Todor Velichkov <[email protected]> wrote: > Right now, your doctor will be deleted if its ProfilePicture gets deleted. > I'm pretty sure you don't want to do that. > I believe this is what you are looking for: > > class Doctor(models.Model): > # When the profile picture gets delete, clear doctors profile > picture (set to NULL) > profilepic = models.ForeignKey(DoctorProfilePic, blank=True, null= > True, on_delete=models.SET_NULL) > > > class DoctorProfilePic (models.Model): > # When the doctor gets deleted, delete its picture too (CASCADE) > # PS. Do not allow orphan ProfilePics (w/o a doctor), i.e. > blank=False, null=False > doc = models.ForeignKey('appointments.Doctor', on_delete=models. > CASCADE) > > > > On Wednesday, November 28, 2018 at 8:06:11 AM UTC+2, Joel wrote: >> >> Ignore the last post. Formatting blues in my main editor. >> >> On Wed, 28 Nov, 2018, 11:34 AM Joel <[email protected] wrote: >> >>> I think you made a typo in the code. doctor can't be a Foreign key for >>> class Doctor. Anyway I get your point, and this is the same way I solved it >>> yesterday. >>> >>> On Wed, 28 Nov, 2018, 11:07 AM Saurabh Agrawal <[email protected] >>> wrote: >>> >>>> >>>>> >>>>> >>>>> 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") >>>>> >>>>> >>>>> >>>> >>>> Setting on_delete to SET_NULL doesn't make much sense here, I think. >>>> This implies that if a doctor is deleted, the profile pic will be >>>> preserved, with the FK to doc being set to NULL in db (which doesn't seem >>>> desirable). I think here CASCADE should work good and will not have the >>>> issue that the OP is facing. >>>> >>>> >>>> >>>> >>>> >>>> >>>>> >>>>> >>>>> …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]. >>>>> 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/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 >>>>> <https://groups.google.com/d/msgid/django-users/360df97b2ca14af69267bd6e98436ac6%40iss2.ISS.LOCAL?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/CAL1UH0s7vMZ%3DWrU%2BJCwVMVzeQWkfAUM9p_KCgfhDQX7Nuv-GSQ%40mail.gmail.com >>>> <https://groups.google.com/d/msgid/django-users/CAL1UH0s7vMZ%3DWrU%2BJCwVMVzeQWkfAUM9p_KCgfhDQX7Nuv-GSQ%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/c330d2a3-3fa1-458f-9c4d-519c70de3257%40googlegroups.com > <https://groups.google.com/d/msgid/django-users/c330d2a3-3fa1-458f-9c4d-519c70de3257%40googlegroups.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/CAA%3Diw_9kRoMn3vc0RS_ZyvdjQp30uK6w9BcE-usrSnad-Kj_Cg%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.

