【问题标题】:update model instance which has m2m fields also更新具有 m2m 字段的模型实例
【发布时间】:2018-03-13 13:14:00
【问题描述】:

我想更新我的模型实例,使用.update(**kwargs) 用于非真实字段,.clear() 后跟.add() 用于相关字段。我的问题是一次只有一个被执行。

当我执行以下操作并更新 m2m 字段时:

def preview(request):
    worksheet_object = WorkSheet.objects.get(pk=int(wsheet_id))
    worksheet_object.question.clear()
    worksheet_object.question.add(*question_pk_list)
    #other m2m fields

但我也想更新不相关的字段,当我执行以下操作时它不起作用:

def preview(request):
    worksheet_object = WorkSheet.objects.get(pk=int(wsheet_id)).update(
                                        classroom=worksheet_data['classroom'],
                                        category=worksheet_data['category'], 
                                        #other fields)
    worksheet_object.question.clear()
    worksheet_object.question.add(*question_pk_list)
    #other m2m fields

在我看来,我正在使用this 答案和this 答案来做同样的事情。

谁能帮助找出我做错了什么?以及如何纠正?

【问题讨论】:

    标签: python django many-to-many


    【解决方案1】:

    以下语句存在一些问题

    WorkSheet.objects.get(pk=int(wsheet_id)).update(
                                        classroom=worksheet_data['classroom'],
                                        category=worksheet_data['category'], 
                                        #other fields)
    
    • update 方法可用于查询集而不是模型实例。您首先使用的是get,它返回一个模型实例。
    • 同样对于查询集,update 方法返回更新的行数,而不是对象,但您需要对象来更新 m2m 字段。

    要解决您的问题,您可以先获取对象,然后将其保存。之后,您可以更新 m2m 字段。

    def preview(request):
        worksheet_object = WorkSheet.objects.get(pk=int(wsheet_id))
        worksheet_object.classroom=worksheet_data['classroom']
        worksheet_object.category=worksheet_data['category']
        # other fields
        worksheet_object.save()
    
        worksheet_object.question.clear()
        worksheet_object.question.add(*question_pk_list)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-03
      • 2020-08-13
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      • 2017-10-26
      相关资源
      最近更新 更多