Django中如何从2个User模型随机对象创建Meeting对象并修复报错
报错根因
- 核心报错来自代码行
matched_user = User:你直接将User模型类赋值给了变量,而创建Meeting对象时需要传入User的实例对象,系统读取时期望拿到实例的数字id,却拿到了类对象,自然抛出类型错误。 - 逻辑bug1:你在
else分支(已判定当前用户没有freedate的场景下)依然写了for dates in freedate:遍历逻辑,这部分代码永远不会执行。 - 逻辑bug2:每次找到匹配用户就覆盖
matched_user变量,最终只会保留最后一个符合条件的匹配结果,所以仅生成1条Meeting记录。 - 逻辑bug3:外层的
for k in range(math.floor(n/2))属于冗余逻辑,内层已经在遍历所有用户,完全没有作用。
修复后可直接运行的代码
import math from django.contrib.auth import get_user_model def createMeeting(): user_p = get_user_model() # 提前预加载关联数据,大幅减少循环时的数据库查询次数 all_users = user_p.objects.exclude(username="Admin").prefetch_related('userprofile', 'freedate_set') # 存储已生成会议的用户对,避免重复创建 created_pairs = set() for user in all_users: user_freedates = list(user.freedate_set.all()) # 当前用户无空闲时间直接跳过 if not user_freedates: continue # 优先取用户关注列表的用户作为匹配候选 candidate_users = [] starred_profiles = user.userprofile.desired_user.all() if starred_profiles.exists(): candidate_users = [profile.user for profile in starred_profiles if profile.user is not None and profile.user.username != "Admin"] else: # 无关注用户则取所有其他普通用户作为候选 candidate_users = [u for u in all_users if u.id != user.id] # 遍历所有候选用户校验匹配条件 for candidate in candidate_users: pair_key = frozenset({user.id, candidate.id}) # 这对用户已经生成过会议直接跳过 if pair_key in created_pairs: continue candidate_freedates = list(candidate.freedate_set.all()) if not candidate_freedates: continue # 校验是否有共同空闲时间 has_common_time = False for u_date in user_freedates: for c_date in candidate_freedates: if u_date.FreeTime == c_date.FreeTime and u_date.FreeDay == c_date.FreeDay: has_common_time = True break if has_common_time: break # 符合条件创建会议 if has_common_time: Meeting.objects.create( user1=user, user2=candidate # 如果你需要指定会议地点,可取消下方注释替换为实际存在的MeetingPlace实例 # meeeting_place=MeetingPlace.objects.first() ) created_pairs.add(pair_key)
额外注意事项
你的Meeting模型中meeeting_place字段已设置null=True,可以不传值,若提交作业需要填充该字段,提前在数据库创建好MeetingPlace记录填入即可。
内容的提问来源于stack exchange,提问作者NoaH
相关产品推荐
相关产品推荐

