【问题标题】:Django Models: combine multiple fields entries for one fieldDjango 模型:为一个字段组合多个字段条目
【发布时间】:2017-05-13 17:33:05
【问题描述】:

我正在为比赛制作一个网站,并且我有一个类似这样的模型

class Participant(models.Model):
    def __unicode__(self):
            return "Participant: " +  str(self.uuid)
    uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    participant = models.CharField(max_length=30, blank=False)
    redditusername = models.CharField("Reddit Username",max_length=21)
    slackusername = models.CharField("Slack Username", max_length=21)
    challengeone = models.CharField("Points for challenge 1", max_length=30,blank=False)
    challengetwo = models.CharField("Points for challenge 2", max_length=30,blank=False)
    challengethree = models.CharField("Points for challenge 3", max_length=30,blank=False)
    challengefour = models.CharField("Points for challenge 4", max_length=30,blank=False)
    challengefive = models.CharField("Points for challenge 5", max_length=30,blank=False)   
    totalpoints = models.CharField("Points for all challenges ", max_length=30,blank=False)

我知道这是一个糟糕的设计。我必须手动输入点。计算点,然后将它们添加到totalpoints。我的问题是如何将挑战组合一、二、三、四、五并获得总分,并有一个字段totalpoints,其中字段分自动添加到该字段中

【问题讨论】:

    标签: python django python-2.7 django-models


    【解决方案1】:

    您可以使用override the models' save 方法。

    类似这样的:

    class Participant(models.Model):
        #... blah
    
        def save(self, *args, **kwargs): 
            self.totalpoints = self.challengeone + self.challengetwo #+ ...
            super(Participant, self).save(*args, **kwargs)
    

    现在,每次调用 save 方法时,它都会自动运行。

    因为你有blank=False(事实上这是默认的,所以你不必指定它)——这可以确保数据库在插入时不会失败。

    解决此问题的另一种方法是使用django's presave signal,它具有相同的净效果,但通过信号实现

    【讨论】:

      【解决方案2】:

      您可以在模型中使用@property 装饰器来计算结果。 比如:

      @property
      def totalpoints():
          return <Your Query here>
      

      现在,如果您不想每次都进行查询以检索 totalpoints,您可以使用名为 post_save() 的 Django 信号方法 您可以阅读有关here 的信息。每当您指定的模型类中的任何点有更新时,都会调用此方法并将结果存储在常规整数类型字段totalpoints中。

      【讨论】:

      • 这种方法确实有效,但只是想指出 post_save 可以工作,前提是该字段被标记为可为空。
      猜你喜欢
      • 2018-11-01
      • 2019-02-22
      • 2021-10-05
      • 1970-01-01
      • 2019-03-11
      • 2015-06-10
      • 2015-09-26
      • 2012-12-16
      • 2017-01-31
      相关资源
      最近更新 更多