我有一个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”
以干净的方式进行此操作的最佳方法是什么?
答案 0 :(得分:3)
您需要将代码分为3个步骤
先get
,然后再更新
ip_group = IPGroup.objects.get(id=2)
更新字段
ip_group.junos_space_id=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},
)