Метод экземпляра модели Django не вызывается - PullRequest
0 голосов
/ 16 октября 2019

Я хочу обновить свою модель при входе в систему (чтобы проверить полномочия человека из внешней системы).

Код моей модели выглядит следующим образом:

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 голосов
/ 16 октября 2019

Это не то, как вы вызываете методы в 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 напрямую;в противном случае есть несколько сторонних библиотек, которые заботятся о сериализации и десериализации ваших данных при загрузке / сохранении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...