在Django中创建医患数据库遇模型语法错误求助
解决Django模型中的SyntaxError及多对多关联问题
嘿,我来帮你搞定这个问题!你遇到的SyntaxError: positional argument follows keyword argument其实是代码里的小失误导致的,咱们一步步来修复:
一、先找到语法错误的元凶
看你贴的代码,在usr_info模型里,name = models.ForeignKey(User ,on_delete = models.CASCADE)之后直接写了一句中文说明,而且没加注释符号——这行中文会被Python当成代码解析,直接触发语法错误。另外你的__str__方法返回self.recent_doc也有问题,因为多对多字段是一个集合,不能直接返回它。
原代码里的问题点:
class usr_info(models.Model): # ... 其他字段 ... name = models.ForeignKey(User ,on_delete = models.CASCADE) 我尝试为用户信息类添加多医生关联字段: # 这里没加#注释,属于无效代码! recent_doc = models.ManyToManyField(doc_info) def __str__(self): return self.recent_doc # 多对多字段是集合,不能直接返回
二、一步步修复代码
1. 注释中文说明,修正基础语法
把那句中文说明用#注释掉,让Python忽略它。
2. 优化字段写法(规范+实用)
- 对于
age、height这类数值型字段,别用TextField,换成IntegerField或FloatField更合理,方便后续做数据验证和统计。 - 给外键和多对多字段加上
related_name,方便后续反向查询(比如从医生那里快速找到关联的用户)。
3. 修复__str__方法
多对多字段对应的是一个QuerySet集合,直接返回会显示成一堆不可读的对象描述,咱们改成返回用户的用户名,或者拼接几个关联的医生名称,让输出更友好。
三、修正后的完整代码
医生信息模型(小优化命名规范)
class DocInfo(models.Model): # 按照PEP8规范用大驼峰命名 doc_name = models.CharField(max_length=100) # 姓名用CharField更合适,限制长度 speciality = models.CharField(max_length=100) exp = models.CharField(max_length=50) # 比如"10年",或者用IntegerField存年份 contact = models.CharField(max_length=20) def __str__(self): return self.doc_name
用户信息模型(修复后)
from django.contrib.auth.models import User # 确保导入User模型 class UserInfo(models.Model): # 大驼峰命名更规范 age = models.IntegerField() # 换成数值型字段 blood_group = models.CharField(max_length=10) height = models.FloatField() # 比如175.5cm weight = models.FloatField() vision = models.CharField(max_length=20) address = models.TextField() note = models.TextField() last_updated = models.DateTimeField(auto_now=True) # 外键添加related_name,方便从User反向查用户信息 user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="profile") # 多对多关联,添加related_name方便从医生端查关联用户 recent_docs = models.ManyToManyField(DocInfo, related_name="patients") def __str__(self): # 返回可读性强的字符串,比如用户名+关联的前3个医生名称 doc_names = ", ".join([doc.doc_name for doc in self.recent_docs.all()[:3]]) return f"{self.user.username} | 关联医生: {doc_names or '无'}"
四、额外小贴士
- 模型类名用大驼峰(比如
DocInfo而非doc_info),字段名用小蛇形,符合Django和PEP8的编码规范,团队协作时更易读。 - 如果
exp是存医生的从业年限,用IntegerField更合适,比如exp = models.IntegerField(verbose_name="从业年限(年)"),方便后续做筛选(比如找从业5年以上的医生)。
内容的提问来源于stack exchange,提问作者Amit Vyas
相关产品推荐
相关产品推荐

