Django模型:基于另一个字段值为字段自动赋值

问题描述:

我正在通过Django教程开展工作。 在民意调查应用程序管理页面中,我想根据民意调查问题的第一个字符创建一个list_filterDjango模型:基于另一个字段值为字段自动赋值

为了解决这个问题,我想在问题模型中添加一个字段,将问题文本的第一个字符作为值。但是,我希望该字段的值自动设置。我试过几种方法,但我不明白几件事情:

从教程中的代码:

class Question(models.Model): 
    def __str__(self): 
     return self.question_text 
    def was_published_recently(self): 
     return self.pub_date >= timezone.now() - datetime.timedelta(days=1) 
    question_text = models.CharField(max_length=200) 
    pub_date = models.DateTimeField('date published') 
  1. 我尝试添加另一场类似这样的:

    first_char = question_text[:1] 
    

我收到错误:

'CharField' object is not subscriptable

我想我不能在模型类中添加一个正常值。为什么我会得到这个错误,即使question_text是一个字符串?

  1. 我试图重写__init__,但即使没有错误,数据库未填充:

    def __init__(self,*args,**kwargs): 
        super(Question, self).__init__(*args, **kwargs) 
        self.first_char = self.question_text[:1] 
    first_char = models.CharField(max_length=1) 
    
  2. 怎么能这个目标实现?

    的Django:1.7
    Ubuntu的:14.04

开始=>
+0

感谢ZygD的编辑! –

我不认为你应该添加到数据库中的字段只是为了好看过滤器的管理。

无论如何,你的问题是你不是将first_char赋值给对象的值,而是将charField赋值给CharField,而不是可以下载的,就像错误告诉你的一样。我会建议通过教程和学习,更多,但这里是你的问题的答案。

重写保存()方法,并添加有字段:

class Question(models.Model): 
    ... 
    first_char = models.CharField(max_length=1) 

    def save(self): 
     # self.first_char for referencing to the current object 
     self.first_char = self.question_text[1] 
     super().save(self) 

现在,每当对象被保存,first_char将被设置到QUESTION_TEXT的第一个字符。

+0

谢谢!重写save()的想法并没有到我这里来。这很有帮助! –