জ্যাঙ্গো মডেল ফর্ম অবজেক্টের জন্য স্বয়ংক্রিয়ভাবে তৈরি তারিখ?


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()
গ্রেগলটসভ

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
আমি মনে করি @ গ্রেগলটসভের মন্তব্য এই মুহুর্তে পুরানো। ব্যবহার auto_now_addবা auto_nowঠিক কাজ করে । এটি মডেলটি সংরক্ষণের আগে ক্ষেত্রটি সেট করে ( github.com/django/django/blob/stable/3.0.x/django/db/models/… )।
yndolok

26

ঠিক আছে, উপরের উত্তরটি সঠিক, অটো_নো_আড্ড এবং অটো_নো এটি করবে, তবে একটি বিমূর্ত শ্রেণি তৈরি করা এবং আপনার প্রয়োজনীয় ক্ষেত্র 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)
    ...
    ...

এইভাবে, আপনি জ্যাঙ্গো ডিআরওয়াইতে অবজেক্ট-ভিত্তিক পুনঃব্যবহারযোগ্যতা অর্জন করতে পারেন (নিজেকে পুনরাবৃত্তি করবেন না)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.