Child model updates Parent model in Django ForeignKey relationship












0














Assuming the following models schema,



Parent model:



class Batch(models.Model):
start = models.DateTimeField()
end = models.DateTimeField()


One of many child models:



class Data(models.Model):
batch = models.ForeignKey(Batch, on_delete=models.ON_CASCADE)
timestamp = models.DateTimeField()


My goals is the following: to have a start field of parent model that is always updated when any child model is modified.
Basically, if the timestamp of a newly data instance is older than the start field I want the start field to be updated to that instance timestamp value. In the case of deletion of the data instance which is the oldest time reference point I want batch start field to be updated to the second oldest. Vice-versa for the end field.










share|improve this question



























    0














    Assuming the following models schema,



    Parent model:



    class Batch(models.Model):
    start = models.DateTimeField()
    end = models.DateTimeField()


    One of many child models:



    class Data(models.Model):
    batch = models.ForeignKey(Batch, on_delete=models.ON_CASCADE)
    timestamp = models.DateTimeField()


    My goals is the following: to have a start field of parent model that is always updated when any child model is modified.
    Basically, if the timestamp of a newly data instance is older than the start field I want the start field to be updated to that instance timestamp value. In the case of deletion of the data instance which is the oldest time reference point I want batch start field to be updated to the second oldest. Vice-versa for the end field.










    share|improve this question

























      0












      0








      0







      Assuming the following models schema,



      Parent model:



      class Batch(models.Model):
      start = models.DateTimeField()
      end = models.DateTimeField()


      One of many child models:



      class Data(models.Model):
      batch = models.ForeignKey(Batch, on_delete=models.ON_CASCADE)
      timestamp = models.DateTimeField()


      My goals is the following: to have a start field of parent model that is always updated when any child model is modified.
      Basically, if the timestamp of a newly data instance is older than the start field I want the start field to be updated to that instance timestamp value. In the case of deletion of the data instance which is the oldest time reference point I want batch start field to be updated to the second oldest. Vice-versa for the end field.










      share|improve this question













      Assuming the following models schema,



      Parent model:



      class Batch(models.Model):
      start = models.DateTimeField()
      end = models.DateTimeField()


      One of many child models:



      class Data(models.Model):
      batch = models.ForeignKey(Batch, on_delete=models.ON_CASCADE)
      timestamp = models.DateTimeField()


      My goals is the following: to have a start field of parent model that is always updated when any child model is modified.
      Basically, if the timestamp of a newly data instance is older than the start field I want the start field to be updated to that instance timestamp value. In the case of deletion of the data instance which is the oldest time reference point I want batch start field to be updated to the second oldest. Vice-versa for the end field.







      django






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 12 at 12:25









      André Guerra

      27110




      27110
























          2 Answers
          2






          active

          oldest

          votes


















          1














          One of the possible way to do this is to add post or pre-save signal of relative models and Update your necessary fields according to this. Django official documentation for signal, link. I want to add another link, one of the best blog post i have seen regarding django signal.



          Edit for André Guerra response



          One of easiest way to do a get call and bring Batch instance. What i want to say



          @receiver(post_save,sender=Data)
          def on_batch_child_saving(sender,instance,**kwargs):
          batch_instance = Batch.objects.get(pk=instance.batch)
          if (instance.timestamp < batch_instance.start):
          batch_instance.start = instance.timestamp
          batch_instance.save()

          elif (instance.timestamp > batch_instance.end):
          batch_instance.end = instance.timestamp
          batch_instance.save()





          share|improve this answer































            0














            Based on Shakil suggestion, I come up with this: (my doubt here was on how to save the parent model)



            @receiver(post_save,sender=Data)
            def on_batch_child_saving(sender,instance,**kwargs):
            if (instance.timestamp < instance.batch.start):
            instance.batch.start = instance.timestamp
            instance.batch.save()

            elif (instance.timestamp > instance.batch.end):
            instance.batch.end = instance.timestamp
            instance.batch.save()





            share|improve this answer

















            • 1




              I have updated my answer, you can check it.
              – Shakil
              Nov 12 at 15:48











            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53262168%2fchild-model-updates-parent-model-in-django-foreignkey-relationship%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            2 Answers
            2






            active

            oldest

            votes








            2 Answers
            2






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            1














            One of the possible way to do this is to add post or pre-save signal of relative models and Update your necessary fields according to this. Django official documentation for signal, link. I want to add another link, one of the best blog post i have seen regarding django signal.



            Edit for André Guerra response



            One of easiest way to do a get call and bring Batch instance. What i want to say



            @receiver(post_save,sender=Data)
            def on_batch_child_saving(sender,instance,**kwargs):
            batch_instance = Batch.objects.get(pk=instance.batch)
            if (instance.timestamp < batch_instance.start):
            batch_instance.start = instance.timestamp
            batch_instance.save()

            elif (instance.timestamp > batch_instance.end):
            batch_instance.end = instance.timestamp
            batch_instance.save()





            share|improve this answer




























              1














              One of the possible way to do this is to add post or pre-save signal of relative models and Update your necessary fields according to this. Django official documentation for signal, link. I want to add another link, one of the best blog post i have seen regarding django signal.



              Edit for André Guerra response



              One of easiest way to do a get call and bring Batch instance. What i want to say



              @receiver(post_save,sender=Data)
              def on_batch_child_saving(sender,instance,**kwargs):
              batch_instance = Batch.objects.get(pk=instance.batch)
              if (instance.timestamp < batch_instance.start):
              batch_instance.start = instance.timestamp
              batch_instance.save()

              elif (instance.timestamp > batch_instance.end):
              batch_instance.end = instance.timestamp
              batch_instance.save()





              share|improve this answer


























                1












                1








                1






                One of the possible way to do this is to add post or pre-save signal of relative models and Update your necessary fields according to this. Django official documentation for signal, link. I want to add another link, one of the best blog post i have seen regarding django signal.



                Edit for André Guerra response



                One of easiest way to do a get call and bring Batch instance. What i want to say



                @receiver(post_save,sender=Data)
                def on_batch_child_saving(sender,instance,**kwargs):
                batch_instance = Batch.objects.get(pk=instance.batch)
                if (instance.timestamp < batch_instance.start):
                batch_instance.start = instance.timestamp
                batch_instance.save()

                elif (instance.timestamp > batch_instance.end):
                batch_instance.end = instance.timestamp
                batch_instance.save()





                share|improve this answer














                One of the possible way to do this is to add post or pre-save signal of relative models and Update your necessary fields according to this. Django official documentation for signal, link. I want to add another link, one of the best blog post i have seen regarding django signal.



                Edit for André Guerra response



                One of easiest way to do a get call and bring Batch instance. What i want to say



                @receiver(post_save,sender=Data)
                def on_batch_child_saving(sender,instance,**kwargs):
                batch_instance = Batch.objects.get(pk=instance.batch)
                if (instance.timestamp < batch_instance.start):
                batch_instance.start = instance.timestamp
                batch_instance.save()

                elif (instance.timestamp > batch_instance.end):
                batch_instance.end = instance.timestamp
                batch_instance.save()






                share|improve this answer














                share|improve this answer



                share|improve this answer








                edited Nov 12 at 15:47

























                answered Nov 12 at 12:40









                Shakil

                4371313




                4371313

























                    0














                    Based on Shakil suggestion, I come up with this: (my doubt here was on how to save the parent model)



                    @receiver(post_save,sender=Data)
                    def on_batch_child_saving(sender,instance,**kwargs):
                    if (instance.timestamp < instance.batch.start):
                    instance.batch.start = instance.timestamp
                    instance.batch.save()

                    elif (instance.timestamp > instance.batch.end):
                    instance.batch.end = instance.timestamp
                    instance.batch.save()





                    share|improve this answer

















                    • 1




                      I have updated my answer, you can check it.
                      – Shakil
                      Nov 12 at 15:48
















                    0














                    Based on Shakil suggestion, I come up with this: (my doubt here was on how to save the parent model)



                    @receiver(post_save,sender=Data)
                    def on_batch_child_saving(sender,instance,**kwargs):
                    if (instance.timestamp < instance.batch.start):
                    instance.batch.start = instance.timestamp
                    instance.batch.save()

                    elif (instance.timestamp > instance.batch.end):
                    instance.batch.end = instance.timestamp
                    instance.batch.save()





                    share|improve this answer

















                    • 1




                      I have updated my answer, you can check it.
                      – Shakil
                      Nov 12 at 15:48














                    0












                    0








                    0






                    Based on Shakil suggestion, I come up with this: (my doubt here was on how to save the parent model)



                    @receiver(post_save,sender=Data)
                    def on_batch_child_saving(sender,instance,**kwargs):
                    if (instance.timestamp < instance.batch.start):
                    instance.batch.start = instance.timestamp
                    instance.batch.save()

                    elif (instance.timestamp > instance.batch.end):
                    instance.batch.end = instance.timestamp
                    instance.batch.save()





                    share|improve this answer












                    Based on Shakil suggestion, I come up with this: (my doubt here was on how to save the parent model)



                    @receiver(post_save,sender=Data)
                    def on_batch_child_saving(sender,instance,**kwargs):
                    if (instance.timestamp < instance.batch.start):
                    instance.batch.start = instance.timestamp
                    instance.batch.save()

                    elif (instance.timestamp > instance.batch.end):
                    instance.batch.end = instance.timestamp
                    instance.batch.save()






                    share|improve this answer












                    share|improve this answer



                    share|improve this answer










                    answered Nov 12 at 14:41









                    André Guerra

                    27110




                    27110








                    • 1




                      I have updated my answer, you can check it.
                      – Shakil
                      Nov 12 at 15:48














                    • 1




                      I have updated my answer, you can check it.
                      – Shakil
                      Nov 12 at 15:48








                    1




                    1




                    I have updated my answer, you can check it.
                    – Shakil
                    Nov 12 at 15:48




                    I have updated my answer, you can check it.
                    – Shakil
                    Nov 12 at 15:48


















                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.





                    Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                    Please pay close attention to the following guidance:


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53262168%2fchild-model-updates-parent-model-in-django-foreignkey-relationship%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    List item for chat from Array inside array React Native

                    Thiostrepton

                    Caerphilly