6

アップデート

機能リクエストを提出しました。アイデアはpass、データベースに既に存在するレコードを拒否するかIntegrittyError、データベースによって生成されることです。uniqueunique_together


私は次のモデルを持っています:

class Compositions(models.Model):
    composer_key = models.ForeignKey(
        Composer,
        )
    composition = models.CharField(
        max_length=383,
        )

    class Meta(object):
        unique_together = (('composer_key', 'composition'), )

管理インターフェイスで django-import-export を使用し、csv ファイルに for each エントリを指定せずidに ... csv ファイルの 1 つのペアが既に存在する場合、手順は整合性エラーで中断されます。

duplicate key value violates unique constraint "data_compositions_composer_key_id_12f91ce7dbac16bf_uniq"
DETAIL:  Key (composer_key_id, composition)=(2, Star Wars) already exists.

CSV ファイルは次のとおりです。

id  composer_key    composition
        1           Hot Stuff
        2           Star Wars

アイデアは、管理者でそれを使用skip_rowして実装することでした。

admin.py:

class CompositionsResource(resources.ModelResource):

    class Meta:
        model = Compositions
        skip_unchanged = True
        report_skipped = True


class CompositionsAdmin(ImportExportModelAdmin):
    resource_class = CompositionsResource


admin.site.register(Compositions, CompositionsAdmin)

ただし、各行が特定のデータベース エントリと同じかどうかをチェックするために csv ファイルに が必要skip_rowなため、これで問題が解決するわけではありません。id

unique( )を使用すると、この制御がデータベースによって実行できることを考えると、_togetherこのエラーをキャッチしてから、skip_row = Trueまたは代わりpassにこのエラーを返すことは効果的ではないでしょうか?

4

3 に答える 3

1

models.py:

class Compositions(models.Model):
    composer_key = models.ForeignKey(
        Composer,
        )
    composition = models.CharField(
        max_length=383,
        unique=False
        )
    date_created = models.DateTimeField(default=timezone.now)

    class Meta(object):
        unique_together = (('composer_key','composition'),)

これは、重複するエントリを自動的に破棄するために、上記のモデル用に「オンザフライ」で作成したスクリプトです。./project_name/csv.pyファイルの関連する列にデータを入力するときに、シェルに保存してインポートしましduc.csvた。列にヘッダーを含めないでください。データのみ。

$./manage.py shell
>>> from project_name import csv

csv.py:

from data.models import Composer, Compositions
import csv
import sys, traceback
from django.utils import timezone

filename = '/path/to/duc.csv'

with open(filename, newline='') as csvfile:
    all_lines = csv.reader(csvfile, delimiter=',', quotechar='"')
    for each_line in all_lines:
        print (each_line)
        try:
            instance = Compositions(
                id=None,
                date_created=timezone.now(),
                composer_key=Composer.objects.get(id=each_line[2]),
                composition=each_line[3]
            )
            instance.save()
            print ("Saved composition: {0}".format(each_line[3]))
        except:  // exception type must be inserted here
            exc_type, exc_value, exc_traceback = sys.exc_info()  //debugging mostly
            print (exc_value)
于 2016-07-22T19:05:11.533 に答える