Django编写自定义命令时如何正确引用外键实例
错误原因
你在给Project的client外键字段赋值时传入了字符串'client1',而Django要求外键字段必须传入关联模型的实例,或者使用外键名_id的格式传入关联实例的主键值,所以触发了该报错。
修复方案
方案1:直接传入已创建的Client实例
你已经完成了Client实例的创建和保存,直接把该实例赋值给client字段即可,修改自定义命令的handle方法代码如下:
def handle(self, *args, **options): if options['create_public']: # 创建Client实例并保存 client = Client(name='client1') client.save() # 给Project的client字段直接传入client实例 tenant = Project( schema_name='public', client=client ) tenant.save() self.stdout.write(self.style.SUCCESS('公共租户创建成功'))
方案2:通过主键赋值
你也可以使用client_id字段直接传入关联Client的主键ID,写法如下:
def handle(self, *args, **options): if options['create_public']: client = Client(name='client1') client.save() tenant = Project( schema_name='public', client_id=client.id ) tenant.save()
补充说明
如果你要引用的是之前已经创建好的Client实例,不是本次命令运行时新创建的,需要先从数据库查询到对应的实例再赋值,示例:
# 查询名称为client1的已存在Client实例 exist_client = Client.objects.get(name='client1') tenant = Project( schema_name='public', client=exist_client ) tenant.save()
内容的提问来源于stack exchange,提问作者Ebolasudan
相关产品推荐
相关产品推荐

