2

私の質問を読んでくれてありがとう。

私は写真会社の Web ショップを行っており、csv ファイルを読み取ってデータベース上の製品を更新する必要があります。私はdjango-adaptorsを使用してファイルを反復処理し、情報を保存していますが、最初はうまく機能していますが、コマンドを再度実行すると、アプリは既存のオブジェクトを上書きするのではなく、新しいオブジェクトを作成します。

問題は、Update メタ オプションを使用する正しい方法がわからないことです。(ドキュメントで確認できます)

これは私が今持っているコードです:

from models import Type, Vendor, Product
from adaptor.model import CsvModel
from adaptor import fields as adaptor_fields

# Prepare functions here, but are not relevant information

class csv(CsvModel):
    mfr_code = adaptor_fields.CharField()
    main_photo_url = adaptor_fields.CharField()
    name = adaptor_fields.CharField()
    product_url = adaptor_fields.CharField()
    vendor = adaptor_fields.CharField(prepare=get_or_create_vendor)
    type = adaptor_fields.CharField(prepare=get_or_create_type)
    subtype = adaptor_fields.IgnoredField()
    description = adaptor_fields.CharField()
    specs = adaptor_fields.CharField()
    tags = adaptor_fields.CharField()
    stock = adaptor_fields.IntegerField(prepare=get_stock_value)
    price = adaptor_fields.IntegerField(prepare=format_usd)

    class Meta:
        delimiter = ','
        dbModel = Product
        update = {
            'keys': ['D1 Basic Kit 250/500', 'D1 Studio Kit 250/250']
        }

上記のように、'keys' の値を持つ辞書がありますが、'natural keys' のリストを定義する方法がわからず、コマンドを実行しようとすると KeyError 例外が発生します。

誰かが正しい方法でそれを行う方法を説明できますか?

回答ありがとうございます。

クリスチャン

4

1 に答える 1

2

'keys' は、フィールド値ではなく、フィールド名を指す必要があります。「D1 Basic Kit 250/500」または「D1 Studio Kit 250/250」が名前だと思います。

class csv(CsvModel):
    mfr_code = adaptor_fields.CharField()
    main_photo_url = adaptor_fields.CharField()
    name = adaptor_fields.CharField()
    product_url = adaptor_fields.CharField()
    vendor = adaptor_fields.CharField(prepare=get_or_create_vendor)
    type = adaptor_fields.CharField(prepare=get_or_create_type)
    subtype = adaptor_fields.IgnoredField()
    description = adaptor_fields.CharField()
    specs = adaptor_fields.CharField()
    tags = adaptor_fields.CharField()
    stock = adaptor_fields.IntegerField(prepare=get_stock_value)
    price = adaptor_fields.IntegerField(prepare=format_usd)

    class Meta:
        delimiter = ','
        dbModel = Product
        update = {
            'keys': ['name']   # or mfr_code, main_photo_url, etc..., price
        }
于 2012-11-29T06:13:25.680 に答える