Как обновить поле списка пользователей после создания пользователя;сигналы - PullRequest
0 голосов
/ 02 июня 2018

У меня есть вопрос о модели, который содержит все поля списка пользователей.После создания нового пользователя поле users не обновляется, и мне нужно повторно запустить сервер, чтобы увидеть изменения, и я не хочу этого делать.

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
    users = User.objects.values_list('id','username')
    authorized = MultiSelectField(choices=users,null=True)
    def __str__(self):
        return "{question_text}".format(question_text=self.question_text)

@staticmethod
def update_users(sender, instance, **kwargs):
        #q = Question.objects.all()
        userz = User.objects.values_list('id','username')
        Question.objects.all().update(users=userz)

post_save.connect(Question.update_users, sender=User)

Я получаю: Вопрос не имеет поля с именем 'users'

Я следовал этим советам: Как я могу заставить сигнал Django вызывать метод модели? и все еще не работает, и я застрял.Спасибо за помощь!

1 Ответ

0 голосов
/ 02 июня 2018

Как уже упоминалось в комментариях, в вашей Question модели нет поля с именем user.Закрытое поле (users) не определено должным образом.Похоже, что вы хотите поле ForeignKey или, возможно, поле ManyToMany в зависимости от того, как вы хотите структурировать эти отношения.Вы должны проверить документы об отношениях и о том, как они обрабатываются в ORM django.Кроме того, ваш статический метод update_users, похоже, мало что делает.Похоже, вы хотите добавить всех пользователей к определенному вопросу, но вы передаете список значений, вызывая метод values_list:

    userz = User.objects.values_list('id','username')
    Question.objects.all().update(users=userz)

, но метод обновления вашей модели может просто принятьСами объекты, не переходя к дальнейшему шагу создания values_list.Я не уверен, почему вы это сделаете, но просто как пример того, какого рода аргументы ожидает метод обновления при работе со связанными объектами:

    Question.objects.all().update(users=Users.objects.all())

Использование values_list было бы ошибкой, я считаю.Я настоятельно рекомендую проверить документы Django , чтобы освежить в памяти использование ORM.

В качестве отступления ... вам не нужно делать это:

def __str__(self):
    return "{question_text}".format(question_text=self.question_text)

Как вы можете видеть в своем определении question_text поля, это строковое поле (CharField), поэтому вы можете просто сделать:

def __str__(self):
    return self.question_text

Edit 1:

Djangoиспользует переменные класса для определения полей, но магия метапрограммирования, используемая для его работы, требует, чтобы вы использовали их предопределенные классы полей, чтобы он мог динамически заполнять поля из базы данных.Вы определили это поле с помощью статического списка:

users = User.objects.values_list('id','username') 

Это определение не позволяет ему динамически извлекать данные из базы данных, но, что более важно, при создании таблицы, представленной определением вашей модели, ононеправильно определяет этот столбец.Каждое поле представляет столбец в вашей базе данных, и если вы не определите его, используя надлежащие классы полей, предоставленные в модуле django.models, оно не будет создавать поле.

Это все описано в документации для начинающих.

...