0

我希望将我的网站与 Salesforce 连接,并有一个视图显示用户在 Salesforce 中的活动细分,然后根据分配给每个活动的权重计算总分。我正在使用 Django-Salesforce 来启动连接并扩展 Activity 模型,但我不确定我是否正确设置了 Activity 或OverallScore 类。

下面是我已经拥有的代码。根据我看到的其他类似问题,建议的结果似乎是自定义保存方法,但我担心我的数据库会很快变得庞大,因为连接每 5 分钟刷新一次。

我最大的问题是如何设置 Activity 类的“weighted_score”属性,因为我怀疑我目前所拥有的是否正确。

class Activity(salesforce.models.Model):
    owner = models.ManyToManyField(Profile)
    name = models.CharField(verbose_name='Name', max_length=264, 
           unique=True)
    weight = models.DecimalField(verbose_name='Weight', decimal_places=2, 
         default=0)
    score = models.IntegerField(verbose_name='Score', default=0)
    weighted_score = weight*score

    def __str__(self):
        return self.name


class OverallScore(models.Model):
    factors = models.ManyToManyField(Activity)
    score = Activity.objects.aggregate(Sum('weighted_score'))

    def __str__(self):
        return "OverallScore"

理想的最终结果是每个登录的用户都能“实时”查看他们的活动分数和一个总分数,该分数每 5 分钟从 Salesforce 连接刷新一次,然后在一天结束时我会运行一个 cron 作业来保存一天结束的结果到数据库。

4

1 回答 1

0

仅对明确的部分问题原谅迟到的部分答复。

如果您更喜欢 Django 端或 Salesforce 端的表达式,那么对in字段的算术实现weighted_score取决于您的偏好。

最简单但非常有限的解决方案是@property在方法上使用装饰器。

class Activity(salesforce.models.Model):
    ... # the same fields
    @property
    def weighted_score(self)
        return self.weight * self.score

这可以在 Python 代码中用作self.weighted_score,但它不能以任何方式传递给 SOQL 并且它不会比你(self.weight * self.score)在同一个地方写更长的时间给你更多的权力。

Salesforce SOQL 不支持 SELECT 子句中的算术表达式,但您可以在 Activity 对象的 Salesforce 设置中定义自定义“公式”字段,并将其用作 Django 中的普通数字只读字段。如果活动是任何其他 Salesforce 对象的主从关系,您可以在该对象上应用非常快速的求和、最大值或平均值公式。

多对多字段需要在 Salesforce 设置中手动创建绑定对象并将其分配给through多对多字段的属性。一个例子是 wiki Foreign Key Support。根据经验,您的对象定义必须首先存在于 Salesforce 中,并具有有用的关系(可以是查找关系或查找关系)和可管理的数据结构。然后你可以运行python manage.py inspectdb --database=salesforce ... table names(可选的,使用过的表的 API 名称列表,以空格分隔)这需要大量代码来修剪许多不必要的字段和选择,但仍然比询问某人更容易和可靠地发挥作用。Salesforce 没有特殊形式的自定义ManyToMany 关系,因此所有内容都由models.py 中的ForeignKey 编写。Master-Detail 只是对 ForeignKey 的注释。您最终可以手动创建一个 ManyToMany 字段,但它主要只是一个语法糖,通过“ through=”绑定对象上的两个外键进行正向和反向遍历具有很好的助记符名称。

(其余的问题对我来说太宽泛且不清楚。)

于 2020-06-23T08:59:53.397 回答