我想只有在数据库中没有其他具有相同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()
答案 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
上的对象查找。一旦返回新对象,您可以更新ItemName
和State
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
的值做出进一步的决定。我不确定你为什么要重复原始问题中的所有回报?