জ্যাঙ্গো তারিখের সময় সমস্যাগুলি (ডিফল্ট = ডেটটাইম.নো ())


283

আমার নীচের ডিবি মডেল রয়েছে:

from datetime import datetime    

class TermPayment(models.Model):
    # I have excluded fields that are irrelevant to the question
    date = models.DateTimeField(default=datetime.now(), blank=True)

আমি নীচে ব্যবহার করে একটি নতুন উদাহরণ যোগ করুন:

tp = TermPayment.objects.create(**kwargs)

আমার ইস্যু: ডাটাবেসের সমস্ত রেকর্ডের তারিখ ক্ষেত্রে একই মূল্য রয়েছে যা প্রথম অর্থ প্রদানের তারিখ। সার্ভার পুনরায় চালু হওয়ার পরে, একটি রেকর্ডে নতুন তারিখ রয়েছে এবং অন্য রেকর্ডগুলির সাথে প্রথমটির মতো রয়েছে। দেখে মনে হচ্ছে কিছু ডেটা ক্যাশেড, তবে আমি কোথায় পাই না।

ডাটাবেস: mysql 5.1.25

জাজানো ভি ১.১.১


1
এর মতো কোনও ফাংশনে ডিফল্ট করা সম্ভব নয়?: default=datetime.now- দ্রষ্টব্য, now()ডেটটাইমফিল্ডের মান হিসাবে নয় , কল না করেই ... হ্যান্ডিস যেকোন কেইস।
ভাইরিডিস

উত্তর:


597

দেখে মনে datetime.now()হচ্ছে মডেলটি সংজ্ঞায়িত হওয়ার সময় মূল্যায়ন করা হচ্ছে এবং প্রতিবার আপনি কোনও রেকর্ড যুক্ত করবেন না।

আপনি ইতিমধ্যে যা করার চেষ্টা করছেন তা সম্পাদনের জন্য জ্যাঙ্গোর একটি বৈশিষ্ট্য রয়েছে:

date = models.DateTimeField(auto_now_add=True, blank=True)

অথবা

date = models.DateTimeField(default=datetime.now, blank=True)

দ্বিতীয় উদাহরণ এবং আপনার বর্তমানে যা রয়েছে তার মধ্যে পার্থক্য হ'ল বন্ধনীগুলির অভাব। datetime.nowপ্রথম বন্ধনী ছাড়াই পাস করার পরে, আপনি আসল ফাংশনটি পাস করছেন, যা প্রতিবার একটি রেকর্ড যুক্ত হওয়ার পরে বলা হবে। যদি আপনি এটি পাস করেন datetime.now()তবে আপনি কেবল ফাংশনটি মূল্যায়ন করছেন এবং এটির ফেরতের মানটি পাস করছেন।

জ্যাঙ্গোর মডেল ফিল্ড রেফারেন্সে আরও তথ্য পাওয়া যায়


206
গুরুত্বপূর্ণ দ্রষ্টব্য : অটো_নো_আড্ড ব্যবহার করে অ্যাডমিনে ক্ষেত্রটিকে অ-সম্পাদনাযোগ্য করে তোলে
জিয়ারো

7
দুর্দান্ত উত্তর, ধন্যবাদ। ডিফল্ট হিসাবে ডেটটাইম.নো দিয়ে আরও জটিল অভিব্যক্তি প্রকাশ করার কোনও উপায় আছে কি? উদাহরণস্বরূপ এখন + 30 দিন (নিম্নলিখিতটি কাজ করে না) expiry = models.DateTimeField(default=datetime.now + timedelta(days=30))
মিশেল

26
@ মিমেলা ডেটটাইম.নো একটি ফাংশন, এবং আপনি কোনও ফাংশনে একটি সময়সীমা যুক্ত করার চেষ্টা করছেন। ডিফল্ট মান সেট করতে আপনাকে নিজের কলব্যাকটি সংজ্ঞায়িত করতে হবে, পছন্দ def now_plus_30(): return datetime.now() + timedelta(days = 30)করতে হবে এবং তারপরে ব্যবহার করতে হবেmodels.DateTimeField(default=now_plus_30)
কারসন মায়ার্স

55
অথবা আপনি অবশ্যই করতে পারেনdefault=lambda: datetime.now()+timedelta(days=30)
মাইকেল মায়ার

34
সচেতন থাকুন যে অটো_নো_এডিডি ব্যবহার করা ডিফল্ট ব্যবহারের মতো নয় কারণ ক্ষেত্রটি এখন সর্বদা (অদক্ষযোগ্য) সমান হবে .. আমি জানি যে এটি ইতিমধ্যে বলা হয়েছিল, তবে এটি কেবল 'অ্যাডমিন' পৃষ্ঠাটির একটি মিটার নয়
ভাসহ

115

পরিবর্তে datetime.nowআপনি ব্যবহার করা উচিতfrom django.utils.timezone import now

রেফারেন্স:

সুতরাং এই জাতীয় কিছু জন্য যান:

from django.utils.timezone import now


created_date = models.DateTimeField(default=now, editable=False)

13
এটি একটি খুব গুরুত্বপূর্ণ নোট! আপনি যদি ডেটটাইম ব্যবহার করেন তবে এখন আপনি একটি স্থানীয় ডেটটাইম করতে পারেন যা টাইমজোন সচেতন নয়। যদি আপনি পরে এটি এমন টাইমস্ট্যাম্পযুক্ত ক্ষেত্রের সাথে তুলনা করেন auto_now_add(যা টাইমজোন সচেতন) আপনি ভুল সময়সীমা পার্থক্যের কারণে ভুল গণনা পেতে পারেন।
ইফতা

1
এটি অবশ্যই খুব গুরুত্বপূর্ণ তবে সত্যই নিজের প্রশ্নের উত্তর দেয় না।
সিজন টেকনোলজি

1
সুস্পষ্টভাবে আরও ভাল উপায়
কারমাইন তম্বাসিয়া

28

জ্যাঙ্গো মডেল ডিফল্ট ক্ষেত্রে ডকুমেন্টেশন থেকে :

ক্ষেত্রের জন্য ডিফল্ট মান। এটি কোনও মান বা কলযোগ্য বস্তু হতে পারে। যদি কলযোগ্য হয় তবে প্রতিবারই কোনও নতুন অবজেক্ট তৈরি হওয়ার সময় এটি ডাকা হবে।

সুতরাং নিম্নলিখিত কাজ করা উচিত:

date = models.DateTimeField(default=datetime.now,blank=True)

1
এটি কেবলমাত্র জাঙ্গো 1.8+ তে সম্ভব
ডেভিড

@ ডেভিডনাথন কেন? আমি মনে করি উভয় বিকল্পগুলি 1.4 সাল থেকে বা তার আগে ছিল, এর মধ্যে কল করার জন্য default( জ্যাঙ্গো-চিনিস-ডকস 14.readthedocs.io/en/latest/ref/models/… )
চিহ্নিত করুন

16

ডেভিড সঠিক উত্তর ছিল। প্রথম বন্ধনী () এটি তৈরি করে যাতে কলযোগ্য টাইমজোন.নো () প্রতিবার মডেলটি মূল্যায়ন করা হয়। যদি আপনি () কে টাইমজোন.নো () থেকে (বা ডেটটাইম.নো (), যদি সাদাসিধে ডেটটাইম অবজেক্ট ব্যবহার করেন) থেকে এটি সরিয়ে ফেলেন:

default=timezone.now

তারপরে এটি আপনার প্রত্যাশার মতোই কাজ করবে:
নতুন অবজেক্টগুলি তৈরি হওয়ার সাথে সাথে বর্তমান তারিখটি গ্রহণ করবে তবে আপনি যখনই ম্যানেজ.পি মেকমিগ্রেশন / মাইগ্রেট করবেন তখনই তারিখটি ওভাররাইড করা হবে না।

আমি সবেমাত্র এটির মুখোমুখি হয়েছি। ডেভিডকে অনেক ধন্যবাদ।


10

datetime.now()যখন না নতুন রেকর্ড ডাটাবেসের যোগ করা হচ্ছে যখন বর্গ তৈরি করা হয় মূল্যায়ন করা হয়।

আপনি এই ক্ষেত্রটি যেভাবে সংজ্ঞায়িত করতে চান তা অর্জন করতে:

date = models.DateTimeField(auto_now_add=True)

এই dateক্ষেত্রটি প্রতিটি নতুন রেকর্ডের জন্য বর্তমান তারিখে সেট করা হবে।


6

এইটির উত্তর আসলে ভুল।

মান পূরণের জন্য স্বয়ংক্রিয় ভরাট (অটো_নো / অটো_নো_এডিডি ডিফল্ট হিসাবে একই নয়)। ডিফল্ট মান প্রকৃতপক্ষে ব্যবহারকারী যা দেখায় তা হ'ল এটি যদি একেবারে নতুন অবজেক্ট। আমি সাধারণত যা করি তা হ'ল:

date = models.DateTimeField(default=datetime.now, editable=False,)

নিশ্চিত হয়ে নিন, আপনি যদি এডমিন পৃষ্ঠাতে এটি উপস্থাপন করার চেষ্টা করছেন তবে আপনি এটি 'পঠন_আপনি' হিসাবে তালিকাভুক্ত এবং ক্ষেত্রের নাম উল্লেখ করেছেন

read_only = 'date'

আবার, আমি এটি করি যেহেতু আমার ডিফল্ট মানটি সাধারণত সম্পাদনাযোগ্য হয় না এবং অ্যাডমিন পৃষ্ঠাগুলি অন্যথায় নির্দিষ্ট না করে অ-সম্পাদনযোগ্যগুলিকে উপেক্ষা করে। একটি ডিফল্ট মান নির্ধারণ এবং অটো_ড্যাড যা এখানে কী তা প্রয়োগ করার মধ্যে অবশ্যই একটি পার্থক্য রয়েছে। এটি পরীক্ষা!


6

datetime.now()আপনার ক্লাস তাত্ক্ষণিক হয় একবার, মূল্যায়ন করা হয়। প্রথম বন্ধনী মুছে ফেলার চেষ্টা করুন যাতে ফাংশনটি datetime.nowফিরে আসে এবং তারপরে মূল্যায়ন হয়। আমার নিজের ডিফল্ট মান নির্ধারণের ক্ষেত্রে আমার একই সমস্যা ছিল DateTimeFieldএবং আমার সমাধানটি এখানে লিখেছিলাম ।


5

ফাংশন সংজ্ঞা অনুসারে পাইথন ভাষার রেফারেন্স থেকে :

ফাংশন সংজ্ঞা কার্যকর করা হলে ডিফল্ট প্যারামিটার মানগুলি মূল্যায়ন করা হয়। এর অর্থ হ'ল অভিব্যক্তিটি একবার মূল্যায়ন করা হয়, যখন ফাংশনটি সংজ্ঞায়িত হয় এবং প্রতিটি কলের জন্য একই "প্রাক-গণিত" মান ব্যবহৃত হয়।

সৌভাগ্যক্রমে, জ্যাঙ্গোর আপনি যা চান তার করার একটি উপায় আছে, যদি আপনি এর পক্ষে auto_nowযুক্তি ব্যবহার করেন DateTimeField:

date = models.DateTimeField(auto_now=True)

ডেটটাইমফিল্ডের জন্য জ্যাঙ্গো ডক্স দেখুন ।


0

জ্যাঙ্গো 3.0 এ auto_now_addকাজ করছে বলে মনে হচ্ছেauto_now

reg_date=models.DateField(auto_now=True,blank=True)

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