You need to enable JavaScript to run this app. Django中如何从2个User模型随机对象创建Meeting对象并修复报错
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 01:15:03