链接Django中的update和get方法以更新字段

时间:2019-03-05 10:56:23

标签: python django django-queryset

我有一个Django模型,如下所示:

class IPGroup(models.Model):
    name = models.CharField(max_length=50, unique=True)
    junos_space_id = models.CharField(max_length=50)

class Jira(models.Model):
    jira_id = models.CharField(max_length=50, unique=True)
    ip_groups = models.ForeignKey(IPGroup, null=True, on_delete=models.SET_NULL)

现在我有一个原子的ORM事务,如下所示:

try:
    with transaction.atomic(): 
        IPGroup.objects.filter(id=2).update(junos_space_id=3)
        Jira.objects.filter(jira_id=2)).update(ip_groups_id=2)
except Exception:
    response = Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR,
                        data={'status': 'Database error encountered'})

在一切正常的情况下,此方法效果很好。但是,如果发生错误(如id错误),过滤器只会给出一个空查询集,并且永远不会遇到异常。

我尝试使用 get (而不是过滤器)重写它,如下所示:

try:
    with transaction.atomic(): 
        IPGroup.objects.get(id=2).update(junos_space_id=3)
        Jira.objects.get(jira_id=2)).update(ip_groups_id=2)
except Exception:
    response = Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR,
                        data={'status': 'Database error encountered'})

但这是给我以下属性错误:

  

AttributeError:“ IPGroup”对象没有属性“ update”

以干净的方式进行此操作的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

您需要将代码分为3个步骤

  1. get,然后再更新

     ip_group = IPGroup.objects.get(id=2)
    
  2. 更新字段

     ip_group.junos_space_id=3
    
  3. 保存

     ip_group.save()
    

以供参考docs

答案 1 :(得分:1)

很高兴,update() returns the number of rows matched by the query,所以如果您确实想使用.update()而不是像@AJS的答案所建议的那样加载,更新和保存对象,则可以执行类似的操作

try:
    with transaction.atomic():
        if IPGroup.objects.filter(id=2).update(junos_space_id=3) == 0:
            raise ValueError("No IPGroups matched")
        if Jira.objects.filter(jira_id=2).update(ip_groups_id=2) == 0:
            raise ValueError("No Jiras matched")
except Exception as exc:
    response = Response(
        status=status.HTTP_500_INTERNAL_SERVER_ERROR,
        data={"status": "Database error encountered: %s" % exc},
    )