नीचे दिए गए मेरे मॉडल में, जब location का मान django व्यवस्थापन के अंदर अपडेट किया जाता है, तो मैं previous_location के मान को स्वचालित रूप से अपडेट करना चाहता हूं। मैं इसे कैसे क्रियान्वित करूं? पहले ही, आपका बहुत धन्यवाद।

class Finder(models.Model):
    name = models.CharField(max_length=50, default="")
    location = models.CharField(max_length=50, default="")
    previous_location = models.CharField(max_length=50, default="")
0
Adarsh Pandey 18 अप्रैल 2021, 15:25

3 जवाब

सबसे बढ़िया उत्तर

आप मॉडल पर __init__ और save विधियों को अधिलेखित कर सकते हैं।

class Finder(models.Model):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._initial_location = self.location

    def save(self, *args, **kwargs):
        if self.location != self._initial_location
        self.previous_location = self._initial_location
        return super().save(*args, **kwargs)

इनिट विधि में, आप इस बात पर नज़र रखते हैं कि डेटाबेस से ऑब्जेक्ट को पुनर्प्राप्त करते समय प्रारंभिक स्थान क्या था। सेव मेथड में आप यह देखने के लिए चेक करते हैं कि क्या लोकेशन अब अलग है और अगर यह है तो आप पिछले लोकेशन को शुरुआती लोकेशन असाइन करते हैं।

ध्यान दें कि यदि आप किसी क्वेरीसेट से अपडेट करते हैं तो यह विधि काम नहीं करेगी। प्री-सेव सिग्नल विधि भी नहीं होगी।

1
Brad Martsberger 18 अप्रैल 2021, 13:05

आप संकेतों का उपयोग कर सकते हैं और तुलना कर सकते हैं कि क्या स्थान फ़ील्ड बदल गया है और पुराने मान को पिछले स्थान में जोड़ दें

def on_change_location(
    sender: Any, instance: Finder, **kwargs: dict
) -> None:
    if instance.id is None:  # new object will be created
        pass
    else:
        previous = Finder.objects.get(id=instance.id)
        if previous.location != instance.location :
        instance.previous_location = previous.location


pre_save.connect(receiver=on_change_location, sender=Finder)

मुझे बताओ अगर यह काम करता है, धन्यवाद

0
ladhari 18 अप्रैल 2021, 12:45

मुझे इसके चारों ओर एक रास्ता मिला:

मॉडल में:

    from django.db import models
    from django.db.models.signals import pre_save,post_save
    from django.dispatch import receiver


    # Create your models here.

    class Finder(models.Model):
        name = models.CharField(max_length=50, default="")
        location = models.CharField(max_length=50, default="")
        middle = models.CharField(max_length=50, default="",blank=True)
        previous_location = models.CharField(max_length=50, default="",blank=True)

        def __init__(self, *args, **kwargs):
            super(Finder, self).__init__(*args, **kwargs)
            self.middle = self.location



    @receiver(pre_save,sender=Finder)
    def my_sign(sender, instance, *args, **kwargs):
        instance.previous_location = instance.middle

Admin.py . में

    from django.contrib import admin
    from .models import Finder
    # Register your models here.

    class FinderAdmin(admin.ModelAdmin):
        list_display = ('name', 'location','previous_location',)
        exclude =('middle',)


    admin.site.register(Finder, FinderAdmin)
0
taha maatof 18 अप्रैल 2021, 13:35