Django模型:根据另一个字段值自动赋值给字段

时间:2015-06-27 23:28:50

标签: django

我正在研究Django教程。 在民意调查应用程序管理页面中,我想根据民意调查问题的第一个字符创建list_filter

为了解决这个问题,我考虑在问题模型中添加一个字段,该字段将问题文本的第一个字符作为值。但是,我希望自动设置该字段的值。我尝试了几种方法,但我无法理解一些事情:

教程中的代码:

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]
    
  2. 我收到了错误:

      

    'CharField'对象不可订阅

    我想我无法在模型类中添加正常值。为什么我会收到此错误,即使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

1 个答案:

答案 0 :(得分:0)

我认为你不应该在数据库中添加字段,只是为了在管理员中制作漂亮的过滤器。

无论如何,您的问题是您没有将first_char分配给对象的值,而是分配给CharField,这不是可订阅的,就像错误告诉您的那样。我建议通过教程和学习,更多,但这里是你的问题的答案。

覆盖save()方法,并在那里添加字段:

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的第一个字符。