在 django 中将数据从一个模型批量复制到另一个模型

rah*_*009 2 django model

我有 2 个类似架构的模型,我想从model1到批量复制model2 ,但model2还有 3 个字段,但我想在这些字段中存储 null。

class SubscriberBalanceProcess(models.Model):


    VOICE_SOC = models.CharField(max_length=50, null=True)
    SMS_SOC = models.CharField(max_length=50, null=True)
    DATA_SOC = models.CharField(max_length=50, null=True)
    DATE_TIME = models.DateTimeField(auto_now_add=True, blank=True)
    TOTAL_REMAIN_VOICE = models.BigIntegerField(default=0, null=True, blank=True)
    TOTAL_REMAIN_SMS = models.BigIntegerField(default=0, null=True, blank=True)
    TOTAL_REMAIN_DATA = models.BigIntegerField(max_length=100, null=True, blank=True)


    class Meta:
        db_table = "SUBSCRIBER_BALANCE_PROCESS_TEST"

class SubscriberBalance(models.Model):


    VOICE_SOC = models.CharField(max_length=50, null=True)
    SMS_SOC = models.CharField(max_length=50, null=True)
    DATA_SOC = models.CharField(max_length=50, null=True)
    DATE_TIME = models.DateTimeField(auto_now_add=True, blank=True)
    FILE_ID = models.CharField(max_length=255, null=True)


    class Meta:
        db_table = 'subscriber_balance'




SubscriberBalanceProcess.objects.bulk_create(SubscriberBalance.objects.filter(VOICE_STATUS='N', SMS_FLAG=1, TENANT_ID__in=loginIdList))
Run Code Online (Sandbox Code Playgroud)

回溯(最近一次调用最后):文件“manage.py”,第10行,在execute_from_command_line(sys.argv)文件“C:\ Python27 \ lib \ site-packages \ django \ core \ management__init__.py”,第353行,在execute_from_command_line utility.execute()文件“C:\Python27\lib\site-packages\django\core\management__init__.py”中,第345行,在执行self.fetch_command(subcommand).run_from_argv(self.argv)文件“C :\Python27\lib\site-packages\django\core\management\base.py”,第 348 行,在 run_from_argv self.execute(*args, **cmd_options) 文件“C:\Python27\lib\site-packages\ django\core\management\base.py”,第 399 行,执行输出 = self.handle(*args, **options) 文件“C:\Users\Development\Desktop\python\crons\management\commands\sendsms_voicebalance_process_rule_tarif。 py”,第 74 行,在处理 self.sendsmsVoicebalance() 文件“C:\Users\Development\Desktop\python\crons\management\commands\sendsms_voicebalance_process_rule_tarif.py”,第 30 行,在 sendms Voicebalance activeMVNO = Functions.updateNonRuleMatchRecordByTarif(categoryId) ,类型)文件“C:\Users\Development\Desktop\python\crons\includes\functions.py”,第 49 行,在 updateNonRuleMatchRecordByTarif Functions.truncateUpdateVoice(loginIdList) 文件“C:\Users\Development\Desktop\python\crons \includes\functions.py”,第 64 行,在 truncateUpdateVoice SubscriberBalanceProcess.objects.bulk_create(SubscriberBalance.objects.filter(VOICE_STATUS='N', SMS_FLAG=1, TENANT_ID__in=loginIdL ist)) 文件“C:\Python27\lib\ site-packages\django\db\models\manager.py”,第 122 行,在 manager_method 中返回 getattr(self.get_queryset(), name)(*args, **kwargs) 文件“C:\Python27\lib\site- packages\django\db\models\query.py”,第 447 行,bulk_create self._batched_insert(objs_with_pk, fields, batch_size) 文件“C:\Python27\lib\site-packages\django\db\models\query.py ”,第 1056 行,在 _batched_insert using=self.db) 文件“C:\Python27\lib\site-packages\django\db\models\manager.py”,第 122 行,在 manager_method 中 return getattr(self.get_queryset() , name)(*args, **kwargs) 文件“C:\Python27\lib\site-packages\django\db\models\query.py”,第 1039 行,在 _insert return query.get_compiler(using=using) 中。 execute_sql(return_id) 文件“C:\Python27\lib\site-packages\django\db\models\sql\compiler.py”,第 1059 行,在 SQL 的execute_sql 中,self.as_sql() 中的参数:文件“C: \Python27\lib\site-packages\django\db\models\sql\compiler.py”,第 1019 行,在 self.query.objs 文件中的 obj 的 as_sql 中“C:\Python27\lib\site-packages\django\ db\models\sql\compiler.py”,第 968 行,在 pre_save_val 返回 field.pre_save(obj, add=True) 文件“C:\Python27\lib\site-packages\django\db\models\fields__init__.py” ,第 702 行,在 pre_save 中返回 getattr(model_instance, self.attname)

AttributeError:“SubscriberBalance”对象没有属性“TOTAL_REMAIN_VOICE”

Ale*_*zov 5

问题是你不能只将SubscriberBalance对象提供给SubscriberBalanceProcess创建函数。您应该首先使用公共字段的数据制作适当的实例:

queryset = (SubscriberBalance.objects
            .filter(VOICE_STATUS='N', SMS_FLAG=1, TENANT_ID__in=loginIdList)
            .values('VOICE_SOC', 'SMS_SOC', 'DATA_SOC', 'DATE_TIME', 'FILE_ID'))

new_objects = [SubscriberBalanceProcess(**values) for values in queryset]

SubscriberBalanceProcess.objects.bulk_create(new_objects)
Run Code Online (Sandbox Code Playgroud)