Django:有序的对象列表的高效模型

时间:2012-08-31 00:16:26

标签: python django design-patterns django-models

我有两个类:A和B.每个A都有一个有序的Bs排名,每个B都有一个有序的As排名。

我的models.py:

class A(models.Model):
    name = models.CharField(max_length=200)
    ...

class B(models.Model):
    name = models.CharField(max_length=200)
    ...

class Ranking(models.Model):
    a = models.ForeignKey(A)
    b = models.ForeignKey(B)
    rankofa = models.IntegerField()
    rankofb = models.IntegerField()

我需要做的例子:

  • 查找B排名的数字。
  • 按顺序迭代按特定A排名的所有B,并评估B的某些属性。
  • 转到A排名最低的B,找到该B给予A的排名。

我想将排名设置为对象的数组/列表(或者某种方式不会继续进行昂贵的数据库调用),但不确定如何将其作为Django模型/数据库解决方案。

任何和所有的想法都赞赏。

1 个答案:

答案 0 :(得分:2)

您需要的是intermediary M2M relation

class Seller(models.Model):
    name = models.CharField(max_length=200)

class Customer(models.Model):
    name = models.CharField(max_length=200)
    feedbacks = models.ManyToManyField(Seller, through='Feedback', related_name='feedbacks')

class Feedback(models.Model):
    seller = models.ForeignKey(Seller)
    customer = models.ForeignKey(Customer)
    seller_feedback = models.IntegerField()
    customer_feedback = models.IntegerField()

查找客户排名的卖家数量:

customer.feedbacks.all().count()

按顺序对特定卖家排名的所有客户进行迭代,并评估一些客户财产。

for customer in seller.feedbacks.all():
    do_something(customer)

转到卖家排名最低的客户,找到该客户给予卖家的排名。

def lowes_feedback_response(seller):
    try:
        return models.Feedback.filter(seller=seller).order_by('-seller_feedback')[0].customer_feedback
    except models.Feedback.DoesNotExist:
        return None

我没有评估代码但是你得到了基本的想法