2009-06-02 13 views
11

私はURLを使ってデータベースに新しいレコードを挿入したり更新したりするなど、さまざまな機能を実行するDjangoアプリケーションを作成しています。dictを使用してオブジェクトのメンバーを更新するにはどうすればよいですか?

たとえば、内部アプリケーションによっては、/import/?a=1&b=2&c=3に要求が送信されます。 ビューでは、新しいオブジェクトfoo = Foo()を作成し、fooのメンバーをrequest.GETディクショナリのデータに設定します。 /import/?a=1&b=2&c=3

  • ビューに送ら

    1. リクエスト新しいオブジェクトを作成します:foo = Foo()
    2. オブジェクトをデータで更新されるがここで

      は、私が今やっているものです。ここで

    私がこれまでに得たものである:

    foo.a = request['a'] 
    foo.b = request['b'] 
    foo.c = request['c'] 
    

    明らかにこれが発生しやすい退屈でエラーになります。 URLのデータはオブジェクトのメンバーとまったく同じ名前なので、単純な1対1のマッピングです。

    foo = Foo() 
    foo.update(request.GET) 
    

    をまたはその効果に何か:

    理想的には、私はこのような何かをすることはできませんしたいと思います。

    ありがとうございます!

  • +1

    を蟻が提示する解決策は、あなたが欲しいものを行いますが、どのように検証し、タイプの変換を処理していますか?またはどちらも懸念していない(私はこれが信じ難いと思う)。 –

    +0

    彼らは心配していません。これは、データが1つのデータベースに(検証とともに)挿入され、次に別のデータベースに挿入される完全に社内で使用されています。 –

    答えて

    19

    あなたは動的に属性を設定するSETATTR機能を使用することができます。

    for key,value in request.GET.items(): 
        setattr(foo, key, value) 
    
    +0

    ありがとうございます。私はドキュメントの組み込み関数を見ているので、私は脳のおならを持っていたに違いありません。 –

    +0

    'a_dict'を' request'と 'obj'を' foo'と入れ替えて、Nickのコードとマッチさせたいかもしれません。 –

    +0

    Antでうまくいけばそれを更新しました。再度、感謝します! –

    1

    あなたはほとんどそれを持っています。

    foo = Foo(**request.GET) 
    

    このトリックを行う必要があります。

    +0

    私はエラーが発生します:__init __()キーワードは文字列でなければなりません –

    +1

    キーワードがそのエラーを引き起こすユニコードとして通っている可能性があります。何かを探すために...このコードは3つの異なる書込み方法で私のために働いていました__init __() – JCotton

    +2

    新しい値の辞書を使って既存のモデルを更新するというユースケースは解決しません。 –

    1

    これを使用して永続化されるモデルオブジェクトを作成する場合は、ModelFormを使用することを強くお勧めします。これは、Djangoのための標準的な方法で、あなたが説明したことをバリデーションを加えて行います。

    拡張する - フォーム出力に使用するわけではありません。入力するだけです。次のように:?

    class Foo(models.Model): 
         a = models.CharField(max_length=255), 
         b = models.PositiveIntegerField() 
    
    class FooForm(forms.ModelForm): 
         class Meta: 
          model = Foo 
    
    def insert_foo(request): 
         form = FooForm(request.GET) 
         if not form.is_valid(): 
          # Handle error conditions here 
          pass 
         else: 
          form.save() 
    
         return HttpResponse('Your response') 
    

    を次に、それを/インポート/、/インポート/ A =テストへのGETにバインドされますと仮定し& B = 1 = "テスト" とB = "1で新しいはFooを挿入します"

    +0

    私はフォームやユーザーとのやりとりを望んでいません。データを送信するスクリプトは、夜間にcronジョブで実行され、Djangoが他のものに使用するデータベースを更新します。 –

    3

    request.GETは辞書とclass Fooある場合は__slots__を使用していない、そしてこれも動作するはずです:

    # foo is a Foo instance 
    foo.__dict__.update(request.GET) 
    
    +0

    Django 1.3以降では動作しません –

    +0

    これはDjango 1.6で真のdictオブジェクトを使用して動作します。私はリクエストを試していません.GETまたは.POST。 – James

    関連する問題