You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动