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
相关产品推荐
相关产品推荐

