我有两个表
Table1
和 Table2
具有相同的字段 hash_str
。
from django.db import models
class Table1:
data = JSONField(...)
hash_str = CharField(...)
class Table2:
name = CharField(...)
parsed = DateTimeField(...)
hash_str = CharField(...)
is_updated = BooleanField(...)
# ...
有时我需要根据具有相同哈希值的
Table2
实例更新 Table1
实例。但是我想用Table2.objects.bulk_update(...)
来实现它。因为实例太多,无法像这样一一更新:
# ...
for t2_obj in Table2.objects.filter(is_updated=False):
t1_obj = Table1.objects.get(hash_str=t2_obj.hash_str)
t2_obj.name = t1_obj.data["name"]
t2_obj.parsed = t1_obj.data["parsed"]
t2_obj.is_updated = True
t2_obj.save()
# ...
我怎样才能正确地做到这一点?
Subquery
[Django-doc]:
from django.db.models import OuterRef, Subquery
from django.db.models.functions import Coalesce
Table2.objects.filter(is_updated=False).update(
is_updated=True,
name=Coalesce(
Subquery(
Table1.objects.filter(hash_str=OuterRef('hash_str')).values(
'data__name'
)[:1]
),
'name',
),
parsed=Coalesce(
Subquery(
Table1.objects.filter(hash_str=OuterRef('hash_str')).values(
'data__parsed'
)[:1]
),
'parsed',
),
)
话虽如此,我认为将数据存储在两个表中不太好,那就是数据重复,这最终会带来更多麻烦。通常最好有 one turth:一个包含数据的模型,从而确定在这种情况下
name
是什么。