152

PersonのIDが存在しない場合は、Personなどのモデルオブジェクトを作成するか、そのPersonオブジェクトを取得します。

次のように新しい人を作成するためのコード:

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

しかし、既存の人物オブジェクトをどこで確認して取得するかはわかりません。

4

8 に答える 8

247

あなたの質問が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}
)
于 2014-10-09T19:52:49.040 に答える
196

「存在する場合は更新、それ以外の場合は作成」のユースケースをお探しの場合は、@Zagsの優れた回答を参照してください。


Djangoにはすでにhttps://docs.djangoproject.com/en/dev/ref/models/querysets/#get-or-createget_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
于 2013-01-01T23:46:07.120 に答える
11

Djangoはこれをサポートしています。get_or_createを確認してください

person, created = Person.objects.get_or_create(name='abc')
if created:
    # A new person object created
else:
    # person object already exists
于 2013-01-01T23:48:01.757 に答える
6

少量のオブジェクトの場合、update_or_createは適切に機能しますが、大規模なコレクションを実行している場合は、適切にスケーリングされません。update_or_createは、常に最初にSELECTを実行し、その後UPDATEを実行します。

for the_bar in bars:
    updated_rows = SomeModel.objects.filter(bar=the_bar).update(foo=100)
        if not updated_rows:
            # if not exists, create new
            SomeModel.objects.create(bar=the_bar, foo=100)

これはせいぜい最初のupdate-queryのみを実行し、ゼロ行に一致した場合にのみ別のINSERT-queryを実行します。ほとんどの行が実際に存在すると予想される場合、これによりパフォーマンスが大幅に向上します。

しかし、それはすべてあなたのユースケースに帰着します。主に挿入を期待している場合は、おそらくbulk_create()コマンドがオプションである可能性があります。

于 2018-11-15T13:25:28.160 に答える
4

質問のタイトルは、質問の本文で説明されているように取得または作成するのではなく、作成または更新する方法を尋ねているように見えるため、回答を追加すると思います。

オブジェクトを作成または更新したい場合は、ドキュメントから、.save()メソッドがデフォルトですでにこの動作をしています

Djangoは、INSERTまたはUPDATESQLステートメントを使用する必要性を抽象化します。具体的には、save()を呼び出すと、Djangoは次のアルゴリズムに従います。

オブジェクトの主キー属性がTrueと評価される値(つまり、Noneまたは空の文字列以外の値)に設定されている場合、DjangoはUPDATEを実行します。オブジェクトの主キー属性が設定されていない場合、またはUPDATEが何も更新しなかった場合、DjangoはINSERTを実行します。

「UPDATEが何も更新しなかった場合」と言うときは、基本的に、オブジェクトに指定したIDがデータベースにまだ存在しない場合を指していることに注意してください。

于 2014-06-24T08:57:49.147 に答える
4

get_or_createと同じようにupdate_or_createを使用することもできます。これは、属性としてid(key)、name、age、is_managerを持つモデルPersonを想定したupdate_or_createのパターンです-

update_values = {"is_manager": False}
new_values = {"name": "Bob", "age": 25, "is_manager":True}

obj, created = Person.objects.update_or_create(identifier='id',
                                               defaults=update_values)
if created:
    obj.update(**new_values)
于 2020-12-17T23:49:34.020 に答える
1

作成時の入力の1つが主キーである場合、これで十分です。

Person.objects.get_or_create(id=1)

同じ主キーを持つ2つのデータは許可されていないため、存在する場合は自動的に更新されます。

于 2016-08-03T11:01:04.353 に答える
0

これはあなたが探している答えでなければなりません

EmployeeInfo.objects.update_or_create(
    #id or any primary key:value to search for
    identifier=your_id, 
    #if found update with the following or save/create if not found
    defaults={'name':'your_name'}
)
于 2020-11-03T00:22:00.030 に答える