2017-02-13 76 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字段是唯一的,所以你提供另外兩個成員作爲默認值。

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() 

正如你所看到的,我已經移除了for循環,因爲你沒有在任何地方使用變量ret,所以不需要迭代ov呃所有返回對象。以上功能與您的功能相同。 :)

OR:

您可以用create_or_update方法寫你自己的經理你的models.py內

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 

你會然後分配給你的迴歸模型

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

    objects = ReturnManager() 
+1

嗨Neelik,謝謝你的答案。我建議對第一個答案進行一些更改並將其標記爲正確 – Juanvulcano

+0

好的,您希望我做出什麼改變? – Neelik

1

您需要更改查詢中的參數,以限制ItemID上的對象查找。有一次,返回一個新的對象,你可以更新ItemNameState

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