You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中正确使用外键?新手求助代码问题排查

Django外键使用问题修正方案

先明确你代码里的几个核心问题:

  • Flashcard的__str__方法报错隐患:你在def __str__(self)里返回self.name,但Flashcard模型未定义name字段,运行时会触发AttributeError,必须替换为模型已存在的字段。
  • 外键关联逻辑可选调整:parent_deck = models.ForeignKey(ParentDeck, null=True, on_delete=models.CASCADE)中的null=True允许卡片不关联任何卡组,若要求每张卡片必须归属一个卡组,需删除该参数。
  • 自定义主键的关联注意事项:ParentDeck用deck_name作为主键,后续给Flashcard绑定卡组时,需传入ParentDeck实例或对应的deck_name字符串,而非默认的数字ID。

修正后的完整代码:

from django.db import models

# Create your models here.
class ParentDeck(models.Model):
    deck_name = models.CharField(max_length=300, primary_key=True)

    def __str__(self):
        return self.deck_name
    
    
class Flashcard(models.Model):
    cardID = models.AutoField(primary_key=True)
    question = models.CharField(max_length=300)
    answer = models.CharField(max_length=300)
    due_date = models.DateField()
    # 若要求卡片必须属于卡组,删除null=True
    parent_deck = models.ForeignKey(ParentDeck, null=True, on_delete=models.CASCADE)

    def __str__(self):
        # 替换为模型存在的字段,比如用问题作为显示内容
        return self.question
        # 也可组合字段增强可读性:return f"Q: {self.question} | A: {self.answer}"

新手常用操作示例:

  • 创建卡组并关联卡片:
from datetime import date

# 创建卡组实例
math_deck = ParentDeck.objects.create(deck_name="初中数学公式")
# 创建绑定该卡组的卡片
flashcard = Flashcard.objects.create(
    question="勾股定理表达式?",
    answer="a² + b² = c²",
    due_date=date(2024, 12, 31),
    parent_deck=math_deck  # 直接传入卡组实例
    # 也可通过主键字段绑定:parent_deck_id="初中数学公式"
)
  • 查询指定卡组下的所有卡片:
target_deck = ParentDeck.objects.get(deck_name="初中数学公式")
deck_cards = target_deck.flashcard_set.all()

内容的提问来源于stack exchange,提问作者JeanA_Ross

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 19:57:35