【问题标题】:bulk copy data from 1 model to another in django在 django 中将数据从 1 个模型批量复制到另一个模型
【发布时间】:2016-04-16 20:24:45
【问题描述】:

我有 2 个相似模式的模型,我想从 model1 批量复制到 model2model2 有 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))

Traceback(最近一次调用最后一次):文件“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, type) 文件 "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 行, 批量创建 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 中 返回 getattr(self.get_queryset(), name)(*args, **kwargs) 文件“C:\Python27\lib\site-packages\django\db\models\query.py”,第 1039 行, 在_插入 返回 query.get_compiler(using=using).execute_sql(return_id) 文件 "C:\Python27\lib\site-packages\django\db\models\sql\compiler.py", 第 1059 行,在 execute_sql 中 对于 sql,self.as_sql() 中的参数:文件“C:\Python27\lib\site-packages\django\db\models\sql\compiler.py”,行 1019,在 as_sql 中 对于 self.query.objs 文件“C:\Python27\lib\site-packages\django\db\models\sql\compiler.py”中的 obj,行 968,在 pre_save_val 返回 field.pre_save(obj, add=True) 文件 "C:\Python27\lib\site-packages\django\db\models\fields__init__.py", 第 702 行,在 pre_save 中 return getattr(model_instance, self.attname)

AttributeError: 'SubscriberBalance' 对象没有属性 'TOTAL_REMAIN_VOICE'

【问题讨论】:

标签: django model


【解决方案1】:

问题是您不能只将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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 2011-12-14
    • 2018-07-10
    • 1970-01-01
    • 2013-11-20
    • 2010-12-23
    • 1970-01-01
    相关资源
    最近更新 更多