Django多对多字段关联HashTag触发IntegrityError外键约束报错问题
问题原因
- Django ORM的
get_or_create()方法返回值为二元组结构:(模型实例对象, 布尔值),其中第一个元素是查询到或新创建的模型实例,第二个元素表示该实例是否为本次新创建。你在生成hash_tags列表时直接将完整二元组存入列表,调用多对多字段的set()方法时,Django会将整个二元组当作HashTag的主键值写入中间关联表,从而触发外键约束报错。 - 报错信息中
Key (hashtag_id)=((<HashTag: HashTag object (skills)>, True))也验证了这一点:实际写入外键字段的是包含实例和布尔值的元组,而非实例的主键值。
解决方法
修改列表推导式,仅取get_or_create()返回结果的第一个元素即可:
hash_tags_list = Functions.extract_hashtags(message["message"]) # 加[0]取返回元组的第一个元素(HashTag实例) hash_tags = [HashTag.objects.get_or_create(hash_tag=ht)[0] for ht in hash_tags_list] messageObj.hash_tags.set(hash_tags) # 额外说明:多对多字段的set()方法会直接提交关联表变更,不需要额外调用messageObj.save()
内容的提问来源于stack exchange,提问作者Abhishek AN
相关产品推荐
相关产品推荐

