【问题标题】:m2m returns Nonem2m 返回无
【发布时间】:2019-07-01 23:54:39
【问题描述】:

当用户更改对象的 URL 时,应删除该对象并创建一个新对象:

    ### other fields here ###

    issue = models.ManyToManyField(Issue, null=False, blank=False,)

    def __init__(self, *args, **kwargs):
        super(MyModel, self).__init__(*args, **kwargs)
        self.__original_url = self.url

    def save(self, *args, **kwargs):
        if self.url != self.__original_url:
            my_new_object = MyModel.objects.create(####)
            my_new_object.save()
            my_new_object.issue.add(self.issue) 

问题是 self.issue 正在重新调整 None。 我也试过了

my_new_object.issue.add(MyModel.objects.get(pk = self.id).issue)

同样的事情。 这有什么问题?

【问题讨论】:

  • 您确定在将self.issue 添加到新的my_new_object 实例时已填充它吗?另外你确定你的代码被执行了,比如它是否通过if self.url != self.__original_url检查?
  • 如果通过了测试,所以代码被执行,m2m问题被填充但它返回None。这就是问题所在。

标签: django django-models many-to-many


【解决方案1】:

使用以下一个:

obj = my_new_object.save(commit=False)
obj.issue.add(self.issue) 
obj.save()

【讨论】:

  • 提交不只与 ModelForm 一起使用吗?这不是我的情况,我在模型内部工作。
【解决方案2】:

问题出在这里:

my_new_object.issue.add(self.issue)

您基本上尝试添加 QuerySet 而不是实例。

尝试:

issues = self.issue.all()
for issue in issues:
    self.issue.add(issue)

或更简洁:

my_new_object.issue.add(*self.issue.all())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 2018-08-11
    • 2018-05-31
    • 2011-01-03
    • 2015-08-17
    • 2014-10-20
    相关资源
    最近更新 更多