Django:按计算标准排序(提前案例)

时间:2013-12-17 23:16:35

标签: django django-models django-queryset django-orm

型号:

class Customer(models.Model):
    name = models.CharField(max_length=200)
    time_categoty = models.IntegerField()
    importance = models.IntegerField()

class Interaction(models.Model):
    i_date = models.DateTimeField()

class Interaction_customer(models.Model):
    interaction = models.ForeignKey(Interaction)
    customer = models.ForeignKey(Customer)

假设:

c = Customer.objects.get(pk=1)
x = Interaction.objects.filter(interaction_person__person=c).latest('i_date').i_date

(即给定客户的最新互动)

是否需要:所有客户的列表,按条件排序:  time_category /(datetime.now() - x)* c.importance

请不要在djangoproject.com上给我一个'额外'的链接,我仔细阅读过,但我真的不知道如何在我的情况下实现它。 (案件很难,一周没人能帮忙,django-Jedi被通缉) 任何建设性的想法将不胜感激。 谢谢! //埃德

1 个答案:

答案 0 :(得分:0)

这里有一个ManyToMany关系,第三个模型用于额外数据。通过链接它们,您可以获得api的额外奖励以直接连接它们(这似乎是必需的)。现在问题就在眼前 - 让我们开始为客户创建一个计算数据的方法:

class Customer(models.Model):
    name = models.CharField(max_length=200)
    time_category = models.IntegerField()
    importance = models.IntegerField()
    interactions = models.ManyToManyField('Interaction', through='InteractionCustomer')

    def delta(self):
        ia = self.interactions.latest('i_date').i_date
        return self.time_categoty / ( datetime.now() - ia ) * self.importance

class Interaction(models.Model):
    i_date = models.DateTimeField()

class InteractionCustomer(models.Model):
    interaction = models.ForeignKey(Interaction)
    customer = models.ForeignKey(Customer)

现在我们想按它排序。你可以用python做到这一点:

 sorted( Customer.objects.all(), key=lambda x: x.delta() )

或者,为了提高效率,您可以将其保存到其他字段。虽然在这种情况下,您需要不断更新它。您可以覆盖保存方法,但这只适用于保存手头的Customer对象时,情况可能并非总是如此(因此在以这种方式实现时需要仔细考虑):

class Customer(models.Model):
    ....
    delta = models.IntegerField()

    def save(self, *args, **kwargs):
        self.delta = self.calc_delta()
        super(Customer, self).save(*args, **kwargs)