नीचे दिए गए मेरे मॉडल में, जब 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="")
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)
इनिट विधि में, आप इस बात पर नज़र रखते हैं कि डेटाबेस से ऑब्जेक्ट को पुनर्प्राप्त करते समय प्रारंभिक स्थान क्या था। सेव मेथड में आप यह देखने के लिए चेक करते हैं कि क्या लोकेशन अब अलग है और अगर यह है तो आप पिछले लोकेशन को शुरुआती लोकेशन असाइन करते हैं।
ध्यान दें कि यदि आप किसी क्वेरीसेट से अपडेट करते हैं तो यह विधि काम नहीं करेगी। प्री-सेव सिग्नल विधि भी नहीं होगी।
आप संकेतों का उपयोग कर सकते हैं और तुलना कर सकते हैं कि क्या स्थान फ़ील्ड बदल गया है और पुराने मान को पिछले स्थान में जोड़ दें
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)
मुझे बताओ अगर यह काम करता है, धन्यवाद
मुझे इसके चारों ओर एक रास्ता मिला:
मॉडल में:
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)
संबंधित सवाल
नए सवाल
python
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।