如何在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
相关产品推荐
相关产品推荐

