Django मॉडल फॉर्म ऑब्जेक्ट के लिए स्वचालित निर्माण तिथि?


153

किसी ऑब्जेक्ट के लिए निर्माण तिथि को स्वचालित रूप से सेट करने का सबसे अच्छा तरीका क्या है, और यह भी एक फ़ील्ड जो रिकॉर्ड करेगा जब ऑब्जेक्ट अंतिम बार अपडेट किया गया था?

models.py:

created_at = models.DateTimeField(False, True, editable=False)
updated_at = models.DateTimeField(True, True, editable=False)

views.py:

if request.method == 'POST':
    form = MyForm(request.POST)
    if form.is_valid():
        obj = form.save(commit=False)
        obj.user = request.user
        obj.save()
        return HttpResponseRedirect('obj_list')

मुझे त्रुटि मिली:

objects_object.created_at may not be NULL

क्या मुझे स्वयं यह मान स्वयं सेट करना होगा? मैंने सोचा था कि पारित किए गए मापदंडों का बिंदु था DateTimeField(या वे सिर्फ चूक हैं, और चूंकि मैंने सेट किया है editable=Falseकि वे फॉर्म पर प्रदर्शित नहीं होते हैं, इसलिए अनुरोध में सबमिट नहीं किया जाता है, और इसलिए नहीं मिलता है फार्म में डाल दिया?)।

ऐसा करने का सबसे अच्छा तरीका क्या है? एक __init__विधि?

जवाबों:


312

आप उपयोग कर सकते हैं auto_nowऔर auto_now_addके लिए विकल्प updated_atऔर created_atक्रमशः।

class MyModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

31
auto_nowऔर auto_now_addउन्हें दुष्ट माना जाता है, इसलिए उनसे बचने की कोशिश करें। यह उत्तर बताता है कि क्यों और एक बेहतर तरीका प्रदान करता है, जो save()विधि को ओवरराइड करता है।
gregoltsov

3
यह इस त्रुटि को उत्पन्न करता है:You are trying to add a non-nullable field 'created_at' to gameuser without a default; we can't do that (the database needs something to populate existing rows). Please select a fix: 1) Provide a one-off default now (will be set on all existing rows) 2) Quit, and let me add a default in models.py Select an option: 1 Please enter the default value now, as valid Python The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now() >>> timezone.now()
कलीम उल्लाह



1
मुझे लगता है कि @ gregoltsov की टिप्पणी इस बिंदु पर पुरानी है। उपयोग करना auto_now_addया auto_nowठीक काम करता है। यह मॉडल को सहेजने से पहले फ़ील्ड सेट करता है ( github.com/django/django/blob/stable/3.0.x/django/db/models/… )।
yndolok

26

ठीक है, उपरोक्त उत्तर सही है, auto_now_add और auto_now इसे करेगा, लेकिन यह एक अमूर्त वर्ग बनाने और इसे किसी भी मॉडल में उपयोग करने के लिए बेहतर होगा जहां आपको आवश्यकता होती है created_atऔर updated_atफ़ील्ड।

class TimeStampMixin(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True

अब कहीं भी आप इसका उपयोग करना चाहते हैं आप एक साधारण विरासत कर सकते हैं और आप अपने द्वारा बनाए गए किसी भी मॉडल में टाइमस्टैम्प का उपयोग कर सकते हैं।

class Posts(TimeStampMixin):
    name = models.CharField(max_length=50)
    ...
    ...

इस तरह, आप Django DRY में (अपने आप को दोहराएं नहीं), ऑब्जेक्ट-ओरिएंटेड रियूजेबिलिटी का लाभ उठा सकते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.