我想在登录时更新我的模型(以检查来自外部系统的人员的授权)。
我的模型代码如下:
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
从未被调用...
我从一开始就坚信这是一个微不足道的错误,但我无法弄清楚。
答案 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中直接定义了一个。否则,有几个第三方库负责在加载/保存时对数据进行序列化和反序列化。