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




django django-models (5)

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

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

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

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

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

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

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

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

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


إذا كنت تبحث عن حالة استخدام "تحديث إذا كان موجودًا آخر" ، فيرجى الرجوع إلى Zags بإجابة ممتازة

لدى Django بالفعل get_or_create ، https://docs.djangoproject.com/en/dev/ref/models/querysets/#get-or-create

بالنسبة لك ، يمكن أن يكون:

id = 'some identifier'
person, created = Person.objects.get_or_create(identifier=id)

if created:
   # means you have created a new person
else:
   # person just refers to the existing one

من غير الواضح ما إذا كان سؤالك يسأل عن طريقة 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}
)


تحقق من وجود ملف أو دليل

يمكنك اتباع هذه الطرق الثلاث:

Note1: os.path.isfileيستخدم فقط للملفات

import os.path
os.path.isfile(filename) # True if file exists
os.path.isfile(dirname) # False if directory exists

Note2: os.path.existsالمستخدمة لكل من الملفات والدلائل

import os.path
os.path.exists(filename) # True if file exists
os.path.exists(dirname) #True if directory exists

على pathlib.Pathطريقة (المدرجة في بيثون 3+، للتثبيت مع نقطة لبيثون 2)

from pathlib import Path
Path(filename).exists()




python django django-models