首页 > 解决方案 > 如何根据特定模型字段创建模型属性?

问题描述

假设我有以下模型:

class DriverReview(models.Model):
    driver = models.ForeignKey(Driver, on_delete=models.CASCADE,)
    driving_score = models.PositiveIntegerField(default=1, validators=[MinValueValidator(1), MaxValueValidator(5)])
    communication_score = models.PositiveIntegerField(default=1, validators=[MinValueValidator(1), MaxValueValidator(5)])
    professionalism_score = models.PositiveIntegerField(default=1, validators=[MinValueValidator(1), MaxValueValidator(5)])
    review_text = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    created_by = models.ForeignKey(User, related_name="driver_review_created_by", on_delete=models.CASCADE, null=True, blank=True)
    last_updated = models.DateTimeField(auto_now=True)
    last_updated_by = models.ForeignKey(User, related_name="driver_review_last_updated_by", on_delete=models.CASCADE, null=True, blank=True)
    is_deleted = models.BooleanField(default=False)
    deleted = models.DateTimeField(null=True, blank=True)
    deleted_by = models.ForeignKey(User, related_name="driver_review_deleted_by", on_delete=models.CASCADE, null=True, blank=True)

    @property
    def review_average_score(self):
        review_average_score = round(np.mean([self.driving_score, self.communication_score, self.professionalism_score]), 2)
        return review_average_score

我创建了一个属性来获取评论平均分。问题是我不想对 _score字段进行硬编码。有没有办法过滤包含_score并平均使用它们的字段?

标签: pythondjango

解决方案


是的,您可以通过 来检查字段_meta,因此:

    @property
    def review_average_score(self):
        data = [
            getattr(self, f.attname)
            for f in self._meta.get_fields()
            if '_score' in f.name
        ]
        review_average_score = np.mean(data), 2)
        return review_average_score

推荐阅读