python - قم بإنشاء نموذج أو تحديث جانغو إذا كان موجودًا




django django-models (4)

أرغب في إنشاء كائن نموذجي ، مثل شخص ، إذا كان معرف الشخص غير موجود ، أو سأحصل على ذلك الشخص.

رمز إنشاء شخص جديد على النحو التالي:

class Person(models.Model):
    identifier = models.CharField(max_length = 10)
    name = models.CharField(max_length = 20)
    objects = PersonManager()

class PersonManager(models.Manager):
    def create_person(self, identifier):
        person = self.create(identifier = identifier)
        return person

لكني لا أعرف من أين أتحقق وأحصل على كائن الشخص الموجود.


أعتقد أنني سأضيف إجابة لأن عنوان السؤال يبدو أنه يسأل عن كيفية الإنشاء أو التحديث ، بدلاً من الحصول على أو الإنشاء كما هو موضح في نص السؤال.

إذا كنت تريد إنشاء كائن أو تحديثه ، فإن طريقة .save () بها هذا السلوك افتراضيًا ، من المستندات :

يلخص Django الحاجة إلى استخدام عبارات SQL INSERT أو UPDATE. على وجه التحديد ، عند استدعاء save () ، يتبع Django هذه الخوارزمية:

إذا تم تعيين سمة المفتاح الأساسي للكائن إلى قيمة يتم تقييمها إلى True (على سبيل المثال ، قيمة غير None أو السلسلة الفارغة) ، فإن Django ينفذ UPDATE. إذا لم يتم تعيين سمة المفتاح الأساسي للكائن أو إذا لم يقم التحديث بتحديث أي شيء ، يقوم Django بتنفيذ INSERT.

تجدر الإشارة إلى أنه عندما يقول "إذا لم يقم التحديث بتحديث أي شيء" ، فإنه يشير في الأساس إلى الحالة التي لا يوجد فيها بالفعل رقم التعريف الذي أعطيته للكائن في قاعدة البيانات.


إذا كان أحد المدخلات عند إنشاء مفتاح أساسي ، فسيكون هذا كافياً:

Person.objects.get_or_create(id=1)

سيتم تحديثه تلقائيًا إذا كان موجودًا لأنه لا يُسمح ببيانات جهازي نفس المفتاح الأساسي.



من غير الواضح ما إذا كان سؤالك يسأل عن طريقة get_or_create (متوفرة على الأقل من Django 1.3) أو طريقة update_or_create (جديد في Django 1.7). يعتمد ذلك على كيفية تحديث كائن المستخدم.

استخدام العينة هو كما يلي:

# In both cases, the call will get a person object with matching
# identifier or create one if none exists; if a person is created,
# it will be created with name equal to the value in `name`.

# In this case, if the Person already exists, its existing name is preserved
person, created = Person.objects.get_or_create(
        identifier=identifier, defaults={"name": name}
)

# In this case, if the Person already exists, its name is updated
person, created = Person.objects.update_or_create(
        identifier=identifier, defaults={"name": name}
)




django-models