Django Models, Сбор моделей. Номер AutoField при переопределении метода save () - PullRequest
0 голосов
/ 16 января 2019

У меня есть модель Django для пользователей , а затем отдельная модель для AccessLevels .

При сохранении пользователя с помощью ORM Джанго я также хочу поместить запись в таблицу AccessLevels .

Моя проблема в том, что PK из AccessLevels это PK из Users , и я не могу переопределить save() метод и собрать значение id = models.AutoField(primary_key=True).

Вот мой соответствующий код:

class Users(models.Model):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    # pk
    id = models.AutoField(primary_key=True)

    # client_id
    client_id = models.IntegerField(null=False, blank=False, default="-1")

    ...

    def save(self, *args, **kwargs):
        AccessLevel(user_id=self.id,
                client_id=self.client_id).save(using='default')

        print('Access Level Set for User while saving')
        super(Users, self).save(*args, **kwargs)

Вот важная часть AccessLevel

class AccessLevel(models.Model):

    # pk
    id = models.AutoField(primary_key=True)

    # this is the id for the user, but I get null value
    user_id = models.IntegerField(null=False, blank=False, default="-1")

    client_id = models.IntegerField(null=False, blank=False, default="-1")

Когда я вызываю этот код, я получаю сообщение об ошибке.

root_user = Users(username='root',
                      email='root',
                      first_name='root',
                      last_name='root',
                      phone='root',
                      password=make_password(default_root_pw),
                      type='root').save(using='default')

Вот ошибка

django.db.utils.IntegrityError: нулевое значение в столбце «user_id» нарушает ненулевое ограничение ДЕТАЛИ: В ошибочной строке содержится (3, ноль, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0).

1 Ответ

0 голосов
/ 16 января 2019

Прежде всего, абсолютно не используйте IntegerFields для этих значений. Это внешние ключи, вы должны использовать поле ForeignKey. Они должны называться user и client - обратите внимание, что вы по-прежнему можете получить доступ к базовым идентификаторам, как и раньше.

(Кроме того, нет необходимости явно объявлять поле id; и вы почти никогда не должны переопределять __init__ в модели, но особенно нет никакого смысла переопределять метод, который вызывает только супер метод. Просто удалите что.)

class AccessLevel(models.Model):
    user = models.ForeignKey('Users', null=False, blank=False)
    client = models.ForeignKey('Client', null=False, blank=False)

class Users(models.Model):
    client = models.ForeignKey('Client', null=False, blank=False)

Теперь, для вашей реальной проблемы, идентификатор назначается базой данных, что происходит только после сохранения. Таким образом, вы должны создать связанный элемент после этого.

def save(self, *args, **kwargs):
    super(Users, self).save(*args, **kwargs)
    AccessLevel(user_id=self.id,
            client_id=self.client_id).save(using='default')

    print('Access Level Set for User while saving')

Другой способ создания элемента, который может быть немного понятнее, - это использование метода доступа, предоставляемого внешним ключом:

self.accesslevel_set.create(client_id=self.client_id)

Наконец, хотя это, вероятно, лучше, чем сигнал после сохранения , а не метод сохранения.

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