Django:根据另一个表更新一个表

问题描述 投票:0回答:1

我有两个表

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()
# ...

我怎样才能正确地做到这一点?

python django django-models django-orm
1个回答
0
投票

您可以使用

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
是什么。

© www.soinside.com 2019 - 2024. All rights reserved.