জ্যাঙ্গো মডেল () বনাম Model.objects.create ()


267

দুটি কমান্ড চালানোর মধ্যে এটি কী পার্থক্য:

foo = FooModel()

এবং

bar = BarModel.objects.create()

দ্বিতীয়টি তাত্ক্ষণিকভাবে BarModelডাটাবেজে একটি তৈরি করে, যখন এটির জন্য FooModel, save()পদ্ধতিটিকে ডাটাবেসে যুক্ত করার জন্য স্পষ্টভাবে কল করতে হবে?


47
হ্যাঁ, এটাই পার্থক্য।
ড্যানিয়েল রোজম্যান

উত্তর:


247

https://docs.djangoproject.com/en/stable/topics/db/queries/#creating-objects

একক পদক্ষেপে কোনও অবজেক্ট তৈরি এবং সংরক্ষণ করতে, create()পদ্ধতিটি ব্যবহার করুন ।


3
আমার মতে জাঙ্গো ডক্সটি এই বিষয়টির সাথে কিছুটা স্ববিরোধী। আমারও একই প্রশ্ন ছিল এবং "নোট করুন যে কোনও মডেল ইনস্ট্যান্ট করে তোলা কোনওভাবেই আপনার ডাটাবেসকে স্পর্শ করে না; তার জন্য আপনাকে () সংরক্ষণ করতে হবে।" docs.djangoproject.com/en/1.10/ref/models/inferences/…
নীল

6
আমি এটিকে পরস্পরবিরোধী হিসাবে দেখছি না। অজগর সাধারণত, আপনি বস্তুর নাম তৈরির পদ্ধতি অনুসারে না হয়ে বস্তুর নাম অনুসারে বন্ধনী স্থাপন করে অবজেক্টগুলি ইনস্ট্যান্ট করেন
ডানিকে

3
@ লাদানদী আমি সম্মতি জানাই এটি পরস্পরবিরোধী নয়, তবে অবশ্যই এটি বিভ্রান্তিকর। মূলত নিলসের লিঙ্কে, উদাহরণ 1 হ'ল "তাত্ক্ষণিক" তবে উদাহরণ 2 হ'ল "তাত্ক্ষণিক + সঞ্চয়"। এছাড়াও, আমি যখন কোনও মডেল সংরক্ষণ করতে চাই তা জানতে চাইলে আমার কেন "ক্যোরিস" ডকটি উল্লেখ করা উচিত? জ্যাঙ্গো ডকটিতে সত্যিই প্রচুর বেদনা রয়েছে।
নাকামুড়া

3
@ নাকামুড়া কারণ ইনসার্ট একটি কোয়েরি?
জুয়ানজো কনটি

16

দুটি বাক্য গঠন সমতুল্য নয় এবং এটি অপ্রত্যাশিত ত্রুটি বাড়ে। পার্থক্য দেখানো একটি সাধারণ উদাহরণ এখানে। আপনার যদি একটি মডেল থাকে:

from django.db import models

class Test(models.Model):

    added = models.DateTimeField(auto_now_add=True)

এবং আপনি একটি প্রথম অবজেক্ট তৈরি করুন:

foo = Test.objects.create(pk=1)

তারপরে আপনি একই প্রাথমিক কী দিয়ে একটি অবজেক্ট তৈরি করার চেষ্টা করুন:

foo_duplicate = Test.objects.create(pk=1)
# returns the error:
# django.db.utils.IntegrityError: (1062, "Duplicate entry '1' for key 'PRIMARY'")

foo_duplicate = Test(pk=1).save()
# returns the error:
# django.db.utils.IntegrityError: (1048, "Column 'added' cannot be null")

সুতরাং .create()একটি প্রয়োজনীয় ক্ষেত্র ( null=False) অনুপস্থিত থাকলেও একটি অবজেক্ট তৈরি করে ? আমি আমার প্রকল্পে পরীক্ষা যোগ করছি এবং createঅপ্রত্যাশিত ফলাফল পাচ্ছি
বৈভব বিশাল

না, এটি করা উচিত নয় ... যদিও কিছু ক্ষেত্রের ধরণগুলি জ্যাঙ্গোতে কিছুটা অদ্ভুত আচরণ করে। উদাহরণস্বরূপ, CharFieldযদি সেট null=Falseনা করা থাকে তবে ত্রুটি বাড়াবে না যদি এটি সরবরাহ না করা হয়: এটি কারণ যে জ্যাঙ্গো ডিফল্টরূপে একটি খালি স্ট্রিংতে স্ট্রিং সেট করে ""তাই এটি প্রযুক্তিগতভাবে নয়null
টমাস লিওনার্ড

হ্যাঁ, আমি কেবল চর ক্ষেত্র এবং মাঠের ক্ষেত্রের সাথে সমস্যা (যা মূলত চর ক্ষেত্রও) having এখন জন্য obj = MyModel(), ব্যবহার করে obj.full_clean()
বৈভব বিশাল

10

আপডেট 15.3.2017:

আমি এটি নিয়ে একটি জ্যাঙ্গো-ইস্যু খুলেছি এবং এটি প্রাথমিকভাবে এখানে গ্রহণযোগ্য বলে মনে হচ্ছে: https://code.djangoproject.com/ticket/27825

আমার অভিজ্ঞতাটি হ'ল জ্যাঙ্গোর সাথে রেফারেন্স দিয়ে Constructor( ORM) ক্লাসটি ব্যবহার করার 1.10.5সময় ডেটাতে কিছুটা অসঙ্গতি থাকতে পারে (যেমন তৈরি হওয়া অবজেক্টের বৈশিষ্ট্যগুলি ওআরএম অবজেক্ট প্রোপারটির কাস্টেড টাইপের পরিবর্তে ইনপুট ডেটার ধরণ পেতে পারে) উদাহরণ :

models

class Payment(models.Model):
     amount_cash = models.DecimalField()

some_test.py - object.create

Class SomeTestCase:
    def generate_orm_obj(self, _constructor, base_data=None, modifiers=None):
        objs = []
        if not base_data:
            base_data = {'amount_case': 123.00}
        for modifier in modifiers:
            actual_data = deepcopy(base_data)
            actual_data.update(modifier)
            # Hacky fix,
            _obj = _constructor.objects.create(**actual_data)
            print(type(_obj.amount_cash)) # Decimal
            assert created
           objs.append(_obj)
        return objs

some_test.py - Constructor()

Class SomeTestCase:
    def generate_orm_obj(self, _constructor, base_data=None, modifiers=None):
        objs = []
        if not base_data:
            base_data = {'amount_case': 123.00}
        for modifier in modifiers:
            actual_data = deepcopy(base_data)
            actual_data.update(modifier)
            # Hacky fix,
            _obj = _constructor(**actual_data)
            print(type(_obj.amount_cash)) # Float
            assert created
           objs.append(_obj)
        return objs

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