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

2024-07-06 18:43:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个模型问题,它包含所有用户列表字段。创建新用户后,用户字段不会更新,我需要重新运行服务器以查看更改,我不想这样做。你知道吗

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)

我得到:问题没有名为“用户”的字段

我遵循这些提示:How can I have a Django signal call a model method?仍然没有工作,我卡住了。 谢谢你的帮助!你知道吗


Tags: text用户iddateobjectsmodelsdefusername
1条回答
网友
1楼 · 发布于 2024-07-06 18:43:55

如注释中所述,在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)

但是模型的update方法可以直接获取对象本身,而不需要进一步生成values_list。我不知道您为什么要这样做,但只是举一个例子,说明update方法在处理相关对象时需要什么样的参数:

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

我相信使用价值观列表是个错误。我强烈建议您查看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公司它不会创建字段。你知道吗

这些都包含在入门文档中。你知道吗

相关问题 更多 >