Django中如何根据关联模型已有值创建外键引用
Django 批量导入Comment关联Thread实现
模型定义
现有models.py中定义的模型结构如下:
class Thread(models.Model): title = models.CharField(max_length=400) discussion = models.URLField(max_length=250, unique=True, blank=True, null=True) ... class Comment(models.Model): thread = models.ForeignKey('Thread', null=True, on_delete=models.SET_NULL) thread_name = models.CharField(max_length=100) thread_link = models.URLField(max_length=250) ...
需求
在批量导入脚本addcomments.py中创建Comment对象时,按以下规则处理外键绑定:
- 待导入数据的
thread_link值与Thread模型已有的discussion字段值相等时,将新Comment的thread外键绑定到对应Thread实例 - 无匹配值时,
thread外键设为None
初次尝试逻辑
先将清洗后的评论数据打包为元组列表:
clean_comments = list(zip(thread_name, thread_link))
遍历数据时遇到核心疑问:匹配到Thread时,外键字段应传入何种值,初始逻辑存在未填充的占位项:
for thread_name, thread_link in clean_comments: # 匹配到已存在的Thread时,thread外键的传值未知 Comment.objects.create( thread=???, thread_name=thread_name, thread_link=thread_link) # 无匹配值时设为None Comment.objects.create( thread=None, thread_name=thread_name, thread_link=thread_link)
二次尝试逻辑
改用ORM筛选匹配的Thread实例,但仍未明确外键传值规则:
for thread_name, thread_link in clean_comments: filtered = Thread.objects.filter(discussion=thread_link) if filtered: # 外键传值仍未明确 Comment.objects.create( thread=???, thread_name=thread_name, thread_link=thread_link) else: Comment.objects.create( thread=None, thread_name=thread_name, thread_link=thread_link)
最终实现方案
通过get查询+异常捕获的方式完成需求,同时解决了外键传值疑问:
try: exists = Thread.objects.get(discussion=thread_link) except Thread.DoesNotExist: exists = None Comment.objects.create( thread=exists, thread_name=thread_title, thread_link=thread_link)
知识点说明:Django外键字段支持直接传入关联模型的实例对象,ORM会自动提取对应实例的主键完成绑定,无需手动传入主键值。
内容的提问来源于stack exchange,提问作者Labtoxs
相关产品推荐
相关产品推荐

