Django で重複するオブジェクトを作成しないようにする

Salman Mehmood 2023年6月20日
Django で重複するオブジェクトを作成しないようにする

この記事では、Django の get_or_create() メソッドに取り組みます。 クエリ セット内の冗長なフィールドを回避するために使用される方法。

Django で get_or_create() メソッドを使用する

Django では、get_or_create() メソッドを使用して定義済みの get または create コードを回避する方法があります。 重複するオブジェクトを複数回作成する場合、この方法はそれらを複数回作成するのを避けるのに役立ちます。

try:
    friend = Friend.objects.get(name="Harry jeams")
except DoesNotExist:
    friend = Friend(name="Harry jeams")
    friend.save()

このブロックでは、クエリ セットから friend オブジェクトを取得するときに、このオブジェクトが見つからなかったと仮定して、このオブジェクトを作成しようとします。 他の命令を同時に実行するための複数の要求を受け取る場合、それは競合状況のように見えます。

スレッドの原因で複数の重複したオブジェクトが作成されたため、クエリ セットにオブジェクトが存在しないため、プロセスで例外が発生する可能性があります。

get_or_create メソッドを正しく使用する効率的な方法があり、このメソッドは 1 回の操作ですばやく応答します。

friend, friend_to_friend = Friend.objects.get_or_create(name="Harry jeams")

get_or_create() メソッドが最初に行うことは、get() メソッドを使用してオブジェクトを取得しようとすることです。 残念ながら、最初の試行でオブジェクトの取得に失敗すると、クエリ セットにオブジェクトが作成されます。

出力に "IntegrityError" が表示される場合は、オブジェクトのみを取得して返します。 両方のプロセスが同時に実行され、処理する命令を取得してオブジェクトを作成しようとすると、両方がクエリ セット内の重複オブジェクトとなるオブジェクトを作成します。

これにより重複が作成されるため、モデル フィールドに一意のオブジェクトが必要です。

class Friend(models.Model):
    friend_first_name = models.CharField(max_length=255)
    friend_last_name = models.CharField(max_length=255)


friend, friend_to_friend = Friend.objects.get_or_create(
    first_name="Harry", last_name="jeams"
)

次のコードは、クエリ セット内の一意のオブジェクトを取得および作成するために機能します。

コード例:

class Friend(models.Model):
    friend_first_name = models.CharField(max_length=255)
    friend_last_name = models.CharField(max_length=255)

    class SubClass:
        unique = ("first_name", "last_name")


friend, friend_to_friend = Author.objects.get_or_create(
    first_name="Harry", last_name="jeams"
)

Django の get_or_create() 関数は 2つの変数を返します。 1つ目はオブジェクトで、2つ目はブール変数です。

返されるオブジェクトを取得するだけでよい場合があるため、この構文を使用します。

構文:

friend, friend_to_friend = Friend.objects.get_or_create(
    name="Harry jeams", defaults={"list_of_friend": 0, "place": "college"}
)

クエリ セットにフィールドが 1つしかない場合は、get_or_create() メソッドのデフォルト パラメータの代わりに defaults__exact を使用できます。

著者: Salman Mehmood
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn

関連記事 - Django Object