Django模型在一个事务中用外键对象更新多个实例



在Django项目中我有三个模型:

class First(BaseModel):
.....
class A(BaseModel):
b = models.OneToOneField('B', null=True, blank=True, related_name='B%(class)s', on_delete=models.PROTECT)
first = models.ForeignKey('First', related_name='a_list', on_delete=deletion.PROTECT)
class B(BaseModel):
some_value = models.DecimalField(max_digits=20, decimal_places=6, null=True, blank=True)

在一个函数中,我想用一个事务更新对象A的列表(这样我就不会用多个查询和更新命中DB)。

我试过这样做:

first = First.objects.get(pk=id)
list_a = first.a_list.filter(...).select_related('b')
list_a.update(b__some_value=10)

问题是我得到了错误:

Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/django/db/models/options.py", line 608, in get_field
return self.fields_map[field_name]
KeyError: 'b__some_value'
During the handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "", line 2423, in ...
resp = mview.post(self.get_url(), data=data, format='json')
....
File "/usr/local/lib/python3.7/site-packages/django/db/models/options.py", line 610, in get_field
raise FieldDoesNotExist("%s has no field named '%s'" % (self.object_name, field_name))
django.core.exceptions.FieldDoesNotExist: A has no field named 'b__some_value'

有人知道为什么我得到这个错误或如何实现相同的结果吗?

不能使用update()来更新相关模型上的列所以没有办法在一次交易中完成。但是你可以根据相关字段进行过滤,然后调用.update()

像这样:

B.objects.filter(Ba__id__in=list_a).update(some_value=10)

最新更新