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

Python Django-如果字段不在数据库中,则创建对象,python,django,Python,Django,我只想在数据库中没有其他具有相同ID的对象时创建一个对象。如果修改了下面的参数(如状态),下面的代码将创建相同的项 returns = Return.objects.all() for ret in returns: obj, created = Return.objects.get_or_create(ItemID="UUID", ItemName="Hodaddy", State="Started") obj.save()

我只想在数据库中没有其他具有相同ID的对象时创建一个对象。如果修改了下面的参数(如状态),下面的代码将创建相同的项

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

如果您知道该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
,所以不需要迭代所有返回对象。上述功能等同于您所拥有的功能。:)

或:

您可以在models.py中使用create_或_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()

如果您知道该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
,所以不需要迭代所有返回对象。上述功能等同于您所拥有的功能。:)

或:

您可以在models.py中使用create_或_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()

您需要更改查询中的参数,以便仅在
ItemID
上约束对象查找。返回新对象后,您可以更新
ItemName
状态

obj, created = Return.objects.get_or_create(ItemID="UUID")
if created:
    obj.ItemName="<item-name>"
    obj.State="<Started>"
    obj.save()
obj,created=Return.objects.get\u或\u create(ItemID=“UUID”)
如果创建:
obj.ItemName=“”
obj.State=“”
obj.save()

您需要更改查询中的参数,以便仅在
ItemID
上约束对象查找。返回新对象后,您可以更新
ItemName
状态

obj, created = Return.objects.get_or_create(ItemID="UUID")
if created:
    obj.ItemName="<item-name>"
    obj.State="<Started>"
    obj.save()
obj,created=Return.objects.get\u或\u create(ItemID=“UUID”)
如果创建:
obj.ItemName=“”
obj.State=“”
obj.save()

get\u或\u create
使用所有提供的参数来查找对象

相反,您需要做的是使用special为您不想筛选的字段提供新值

在您的例子中,您只希望UUID字段是唯一的,因此您提供其他两个成员作为默认值

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

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

get\u或\u create
使用所有提供的参数来查找对象

相反,您需要做的是使用special为您不想筛选的字段提供新值

在您的例子中,您只希望UUID字段是唯一的,因此您提供其他两个成员作为默认值

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

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

嗨,尼利克,谢谢你的两个答案。我建议对第一个答案做一些修改,并将其标记为正确。好的,你希望我做什么修改?嗨,尼利克,谢谢你的两个答案。我建议对第一个答案进行一些修改,并将其标记为正确。好的,您希望我做哪些修改?