通过使用FK覆盖另一个模型的save方法来更新对象/实例

时间:2018-09-05 10:11:55

标签: django django-models django-queryset

我有以下型号:

 class Acc(models.Model):
        name = models.CharField( max_length=35)

class User(AbstractBaseUser, PermissionsMixin):

    acc = models.ForeignKey(Acc, blank=True, null=True, related_name='owner', on_delete=models.CASCADE)


class Note(models.Model):
    name = models.CharField( max_length=35
    receiver = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, on_delete=models.CASCADE)

class Item(models.Model):
    note = models.ForeignKey(Notification, on_delete=models.CASCADE,)
    acc = models.ForeignKey(Acc, on_delete=models.CASCADE)

    def save(self, *args, **kwargs):

        .....
        # update note
        Note.objects.filter(id=self.note_id).update(receiver=self.account.owner)

我覆盖save对象/模型上的Item方法,以使用ForeignKey更新Note模型receiver

我收到以下错误:

int() argument must be a string, a bytes-like object or a number, not 'RelatedManager'

它是由以下行触发的:

Note.objects.filter(id=self.note_id).update(receiver=self.acc.owner)

ownerAcc模型的相关管理者,也是一个User模型,我想通过Note中的receiver键获得它。

1 个答案:

答案 0 :(得分:2)

您的模型似乎不对。用户具有Acc的ForeignKey,这意味着每个Acc可能有许多个User对象。因此,acc.owner是一个经理,可让您通过例如acc.owner.all()访问所有这些对象。

您要么希望FK朝着从Acc到User的另一个方向发展-这意味着每个User可以拥有多个Accs-或者您应该使用OneToOneField,以便有一个Acc和一个User。