用户创建后如何更新用户列表字段;信号

时间:2018-06-02 11:04:44

标签: python django signals receiver

我有模型问题,其中包含所有用户列表字段。创建新用户后,用户字段没有更新,我需要重新运行服务器以查看更改,我不想这样做。

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'的字段

我遵循了这些提示:How can I have a Django signal call a model method?但仍然无法正常工作而且陷入困境。  谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

正如评论中所述,您的Question模型中没有名为user的字段。您确实关闭的字段(users)未正确定义。看起来您想要ForeignKey字段或可能ManyToMany字段,具体取决于您希望如何构建该关系。您应该查看docs on relationships以及如何在django ORM中处理它们。此外,您的静态方法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会出错。我强烈建议您查看the Django docs以了解ORM的使用情况。

顺便说一下......你不需要这样做:

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

正如您在question_text字段的定义中所看到的,它是一个字符串字段(CharField)所以您可以这样做:

def __str__(self):
    return self.question_text

编辑1:

Django使用类变量来定义字段,但用于使其工作的元编程魔法要求您使用其预定义的字段类,以便它可以动态填充数据库中的字段。您使用静态列表定义了该字段:

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

此定义不允许它从数据库中动态获取数据,但更重要的是,在创建由模型定义表示的表时,它不能正确定义该列。每个字段代表数据库中的一列,如果没有使用django.models模块中提供的正确字段类来定义它,则不会创建该字段。

这些都包含在入门文档中。