You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django多对多字段赋值报错:禁止直接赋值,请使用set()替代

Django多对多字段赋值报错解决方案

报错信息:

Direct assignment to the forward side of a many-to-many set is prohibited. Use user.set() instead

我的代码:

models.py

class Display(models.Model):
    url = models.URLField(unique=True)
    text = models.CharField(max_length=150) 
    
class Display_Data(models.Model):
    displays = models.ManyToManyField(Display)  
    user = models.ManyToManyField(User)
    choosenum = models.IntegerField()
    puplish_date = models.DateTimeField(default=datetime.now)

views.py

def submit_operation(request):
 if request.method == 'POST':
    url = request.POST.get('url')
    text = request.POST.get('title')
    choosenum = request.POST.get('CHOOSE')

    if Display.objects.filter(url=url).exists():
        display = Display.objects.get(url=url)
        display_data = Display_Data.objects.create(choosenum=choosenum, user=request.user, date_published=datetime.now())
        display_data.displays.add(display)
    else:
        display = Display.objects.create(url=url, text=text)
        display_data = Display_Data.objects.create(choosenum=choosenum, user=request.user, date_published=datetime.now())
        display_data.displays.add(display)        

    return redirect(request.META.get('HTTP_REFERER'))

问题原因

报错核心原因是Display_Data里的user是多对多字段,Django不允许在create()方法中直接给多对多字段赋值,必须先创建对象,再通过add()或set()方法关联多对多关系。另外原代码中模型字段是puplish_date,但创建时写了date_published,这也会导致字段不存在的报错。

修复后的代码

修改views.py的创建逻辑,拆分多对多字段的关联步骤:

def submit_operation(request):
 if request.method == 'POST':
    url = request.POST.get('url')
    text = request.POST.get('title')
    choosenum = request.POST.get('CHOOSE')

    if Display.objects.filter(url=url).exists():
        display = Display.objects.get(url=url)
        # 先创建Display_Data实例,不传入user参数
        display_data = Display_Data.objects.create(choosenum=choosenum, puplish_date=datetime.now())
        display_data.displays.add(display)
        # 单独添加用户关联
        display_data.user.add(request.user)
    else:
        display = Display.objects.create(url=url, text=text)
        # 先创建Display_Data实例,不传入user参数
        display_data = Display_Data.objects.create(choosenum=choosenum, puplish_date=datetime.now())
        display_data.displays.add(display)        
        # 单独添加用户关联
        display_data.user.add(request.user)

    return redirect(request.META.get('HTTP_REFERER'))

内容的提问来源于stack exchange,提问作者mohamed sadik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 06:53:14