Django模型实例方法没有被调用

时间:2019-10-16 14:57:22

标签: python django python-3.x django-models

我想在登录时更新我的​​模型(以检查来自外部系统的人员的授权)。

我的模型代码如下:

import json

from django.contrib.auth.models import AbstractUser
from django.contrib.auth.signals import user_logged_in
from django.db import models

class Person(AbstractUser):
    is_dean = models.BooleanField(null=False, blank=False, default=False)
    is_institute_manager = models.BooleanField(null=False, blank=False, default=False)
    managed_institutes = models.TextField(blank=True, null=True, default=None)

    def get_managed_institutes(self):
        return json.loads(self.managed_institutes)

    def set_managed_institutes(self, value):
        self.managed_institutes = json.dumps(value)


# Signals processing

def check_authorizations(sender, user, request, **kwargs):
    ...
    # check if the user is dean
    is_dean = False

    # logic to check if the user is dean...

    user.is_dean = is_dean

    # Check if the user manages institutes
    is_institute_manager = False
    managed_institutes = list()

    # Logic to check if the user is managing institutes ...

    user.is_institute_manager = is_institute_manager
    user.set_managed_institutes = managed_institutes

    user.save()


user_logged_in.connect(check_authorizations)

令人惊讶的是,布尔标志设置正确,但是方法set_managed_institute从未被调用...

我从一开始就坚信这是一个微不足道的错误,但我无法弄清楚。

1 个答案:

答案 0 :(得分:0)

那不是在Python中调用方法的方式。您需要明确地这样做:

user.set_managed_institutes(managed_institutes)

还是您要定义一个属性?

@property
def managed_institutes(self):
    return json.loads(self._managed_institutes)

@managed_institutes.setter
def managed_institutes(self, value):
    self._managed_institutes = json.dumps(value)

但还要注意,您可能仍然想使用JsonField。如果您使用的是PostgreSQL,则在Django中直接定义了一个。否则,有几个第三方库负责在加载/保存时对数据进行序列化和反序列化。