2017-02-13 7 views
0

データベースに同じIDを持つ他のオブジェクトがない場合にのみ、オブジェクトを作成します。下のコードは、州のような下のパラメータが変更された場合、同じ項目を作成します。Django - データベースにフィールドがない場合にオブジェクトを作成

returns = Return.objects.all() 
for ret in returns: 
    obj, created = Return.objects.get_or_create(ItemID="UUID", 
          ItemName="Hodaddy", State="Started") 
    obj.save() 

答えて

1

get_or_createは、オブジェクトを見つけるために提供すべての引数をオフに動作します。

代わりに行う必要があるのは、フィルタリングしたくないフィールドに新しい値を提供するために特別なdefaults argumentを使用することです。

あなたの場合、UUIDフィールドを一意にするだけで、他の2つのメンバーをデフォルトとして指定することができます。

obj, created = Return.objects.get_or_create(ItemID="UUID", 
       defaults={ItemName:"Hodaddy", State:"Started"}) 

さらに、createdの値に基づいて決定することができます。元の質問のすべての返品を繰り返している理由はわかりません。

2

あなたがIDを知っている場合、あなたはそれを照会することができます:

あなたの質問では、あなたが持っている:

returns = Return.objects.all() 
for ret in returns: 
    return_in_database = Return.objects.filter(ItemId="UUID").exists() 
    if not return_in_database: 
     obj, created = Return.objects.get_or_create(ItemID="UUID", 
         ItemName="Hodaddy", State="Started") 
     obj.save() 

これはと行うことができます。

if not Return.objects.filter(ItemId="UUID").exists(): 
    obj, created = Return.objects.get_or_create(ItemID="UUID", 
         ItemName="Hodaddy", State="Started") 
    obj.save() 

ご覧のとおり、どこでも変数retを使用していなかったので、forループを削除しました。したがって、ovを繰り返し処理する必要はありませんすべてのReturnオブジェクト。上記はあなたが持っていたものと機能的に同等です。 :)

OR:

は、あなたは、あなたのリターンモデルにこれを割り当てます

class ReturnManager(models.Manager): 
    def create_or_update(self, **kwargs): 
     new_return = Return(**kwargs) 
     existing = Return.objects.filter(ItemId=new_returns.ItemID).first() 
     if existing: 
      new_return.pk = existing.pk 
      new_return.id = existing.id 
     new_return.save() 
     return new_return 

あなたのmodels.py内create_or_updateメソッドを使用して独自のマネージャを書くことができ

class Return(model.Models): 
    # your object fields here 

    objects = ReturnManager() 
+1

こんにちはNeelik、両方の答えに感謝します。私は最初の答えにいくつかの変更を提案し、それを正しいものとしてマークします – Juanvulcano

+0

あなたは何を変更したいですか? – Neelik

1

ItemIDでオブジェクトルックアップを制約するには、クエリのparamを変更する必要があります。一度、新しいオブジェクトが返されますが、更新することができItemNameState

obj, created = Return.objects.get_or_create(ItemID="UUID") 
if created: 
    obj.ItemName="<item-name>" 
    obj.State="<Started>" 
    obj.save() 
関連する問題