Django模型关联疑问:Stack与Subject关联未在迁移日志中显示?
别担心,你的关联其实已经生效啦!
嘿,作为刚学Django的新手,看到迁移日志的内容产生怀疑太正常了,但我要告诉你:你理解错啦,Subject和Stack的关联已经完全生效了。
为啥迁移日志没单独显示Subject和Stack的关联?
Django的迁移日志记录逻辑是这样的:
- 当你在创建一个新模型的时候,如果模型里已经包含了外键字段(比如你的Subject里的
stack外键),那么这个外键会和模型的其他字段一起被创建,所以迁移日志里只需要显示- Create model Subject就够了,这个步骤已经包含了stack外键的创建。 - 而日志里的
- Add field subject to card,大概率是你在编写Card模型的时候,先写了key和answer字段,后来才加上subject外键,所以Django会把这个字段的添加作为一个单独的迁移步骤记录下来。但这只是记录顺序的问题,不影响最终的关联效果。
教你两个验证关联是否生效的小方法
作为新手,亲手验证比看日志更靠谱:
用Django Shell测试
打开终端,进入你的项目目录,执行命令:python manage.py shell然后依次输入以下代码(每输一行按回车):
# 导入需要的模型和用户模型 from flashcards.models import Stack, Subject, Card from django.contrib.auth.models import User # 拿一个现有用户(如果没有的话先创建一个:User.objects.create_user(username="testuser", password="123456")) user = User.objects.first() # 创建一个Stack实例 test_stack = Stack.objects.create(author=user, title="测试栈", description="这是一个测试用的栈") # 创建关联这个栈的Subject test_subject = Subject.objects.create(title="测试科目", stack=test_stack) # 创建关联这个科目的Card test_card = Card.objects.create(subject=test_subject, key="什么是Django?", answer="一个Python Web框架!")接下来测试反向查询(Django会自动为外键生成反向关联的集合):
# 从Stack查关联的Subject test_stack.subject_set.all() # 从Subject查关联的Card test_subject.card_set.all()如果这两个查询都能返回你刚才创建的对象,就说明三层关联完全正常工作啦!
直接查看数据库表
不管你用的是SQLite、MySQL还是PostgreSQL,打开数据库查看:flashcards_subject表会有一个stack_id字段,这就是关联Stack表的外键;flashcards_card表会有一个subject_id字段,对应Subject表的外键。
只要这两个字段存在,就证明关联已经生效。
放心吧,你的模型代码写得没问题,只是对Django迁移日志的记录逻辑不熟悉而已,多试几次就懂啦😎
内容的提问来源于stack exchange,提问作者Colton Van Bastelaere
相关产品推荐
相关产品推荐

