Django - 如果字段不在数据库中,则创建对象

时间:2017-02-13 23:45:39

标签: python django

我想只有在数据库中没有其他具有相同ID的对象时才创建对象。如果下面的参数像State一样被修改,下面的代码将创建相同的项目。

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

3 个答案:

答案 0 :(得分: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,因此无需迭代所有Return对象。以上功能与您的功能相同。 :)

OR:

您可以在models.py

中使用create_or_update方法编写自己的经理
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 :(得分:1)

您需要更改查询中的参数,以便仅限制ItemID上的对象查找。一旦返回新对象,您可以更新ItemNameState

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

答案 2 :(得分:1)

get_or_create解决所有为查找对象而提供的参数。

您需要做的是使用特殊defaults argument为您不想过滤的字段提供新值。

在您的情况下,您只希望UUID字段是唯一的,因此您将其他两个成员提供为默认值。

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

然后,您可以根据created的值做出进一步的决定。我不确定你为什么要重复原始问题中的所有回报?