54 lines
1.7 KiB
Python
54 lines
1.7 KiB
Python
"""回填用户 ClubID(缺省或空时设为 xq 或 user_wx_openid 绑定)。"""
|
||
from django.core.management.base import BaseCommand
|
||
from django.db import transaction
|
||
|
||
from jituan.constants import CLUB_ID_DEFAULT
|
||
from jituan.models import UserWxOpenid
|
||
from users.business_models import User
|
||
|
||
|
||
class Command(BaseCommand):
|
||
help = '回填 User.ClubID:OpenID 绑定 → user_wx_openid,否则默认 xq'
|
||
|
||
def add_arguments(self, parser):
|
||
parser.add_argument(
|
||
'--dry-run',
|
||
action='store_true',
|
||
help='仅统计不落库',
|
||
)
|
||
|
||
def handle(self, *args, **options):
|
||
dry_run = options.get('dry_run', False)
|
||
updated = 0
|
||
skipped = 0
|
||
|
||
users = User.query.all()
|
||
for user in users:
|
||
current = getattr(user, 'ClubID', None) or ''
|
||
if current and current != CLUB_ID_DEFAULT:
|
||
skipped += 1
|
||
continue
|
||
|
||
new_club = CLUB_ID_DEFAULT
|
||
if user.OpenID:
|
||
binding = UserWxOpenid.query.filter(openid=user.OpenID).order_by('id').first()
|
||
if binding:
|
||
new_club = binding.club_id
|
||
|
||
if current == new_club:
|
||
skipped += 1
|
||
continue
|
||
|
||
if dry_run:
|
||
self.stdout.write(f'[dry-run] {user.UserUID} -> ClubID={new_club}')
|
||
updated += 1
|
||
continue
|
||
|
||
with transaction.atomic():
|
||
user.ClubID = new_club
|
||
user.save(update_fields=['ClubID'])
|
||
updated += 1
|
||
|
||
suffix = '(dry-run)' if dry_run else ''
|
||
self.stdout.write(self.style.SUCCESS(f'完成{suffix}:更新 {updated},跳过 {skipped}'))
|