必要なものget_or_create
:
car,created = Car.objects.get_or_create(slug='car-slug')
if created:
print 'New car was created'
car.slug = 'new-car-slug'
else:
# do whatever needs to be done here
# with the existing car object, which will
# be car
# car.name = 'new name'
car.save()
に提供する引数に関係なくget_or_create
、それらを使用してモデルの既存のレコードを検索します。
どのフィールドの組み合わせが重複をトリガーするかわからないとします。簡単な方法は、モデル内のどのフィールドにその制限があるか (つまりunique=True
) を見つけることです。モデルからこの情報を内省できます。または、より簡単な方法は、単にこれらのフィールドを に渡すことget_or_create
です。
最初のステップは、XML フィールドとモデルのフィールドの間のマッピングを作成することです。
xml_lookup = {}
xml_lookup = {'CAR-SLUG': 'slug'} # etc. etc.
必要に応じて、これをすべてのフィールドに入力できますが、一意の制約があるフィールドのみを入力することをお勧めします。
次に、XML を解析している間に、レコードごとに辞書を作成し、各フィールドをマッピングします。
for row in xml_file:
lookup_dict = {}
lookup_dict[xml_lookup[row['tag']] = row['value'] # Or something similar
car, created = Car.objects.get_or_create(**lookup_dict)
if created:
# Nothing matched, a new record was created
# Any any logic you need here
else:
# Existing record matched the search parameters
# Change/update whatever field to prevent the IntegrityError
car.model_slug = row['MODEL_SLUG']
# Set/update fields as required
car.save() # Save the modified object