Django带外键模型测试失败:无法获取setUp中创建的Card实例
解决Django测试中无法查询外键关联Card实例的问题
我来帮你搞定这个问题!咱们直接说核心问题:你在查询Card时的外键参数写法不符合Django ORM的规则,这才导致找不到实例。
问题根源
你当前的查询语句是:
card = Card.objects.get(category=category.id, question='Hello?', answer='Hello!', slug='slug' )
Django的外键字段查询有明确规则:
- 如果用外键字段名(比如这里的
category),需要传入对应的模型对象 - 如果要传入ID值,必须用外键字段名加
_id后缀,也就是category_id=category.id
你把ID值直接传给了category参数,Django会尝试去匹配一个主键等于category.id的Category对象,这显然和你创建的数据不匹配,所以抛出了DoesNotExist异常。
两种可行的修复方案
方案1:直接传入Category对象(最直观)
card = Card.objects.get(category=category, question='Hello?', answer='Hello!', slug='slug' )
外键字段本身就是关联到Category对象的,直接传对象完全符合Django ORM的设计逻辑,代码也更易读。
方案2:用_id后缀传入ID值
card = Card.objects.get(category_id=category.id, question='Hello?', answer='Hello!', slug='slug' )
这种方式直接针对数据库里的category_id字段查询,适合你明确知道ID值的场景。
额外小提示
你提到尝试用'Test Category'作为category参数,这肯定不行——外键字段只能接受对应模型的对象或ID值,不能直接传分类名称。如果想用分类名称查询Card,需要用双下划线的跨表查询:
card = Card.objects.get(category__category_name='Test Category', question='Hello?', answer='Hello!', slug='slug' )
修改后你的测试应该就能正常找到目标Card实例了!
内容的提问来源于stack exchange,提问作者Nicholas Crook




