型号:
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被通缉) 任何建设性的想法将不胜感激。 谢谢! //埃德
答案 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)