如何将子模型中的最新记录包含到查询中

时间:2011-03-30 11:26:56

标签: django django-models django-queryset

我有定期评估的交易员。评估对交易者有外键。我想列出所有交易者以及他们当前的评估状态。使用添加到Trader模型的自定义属性可以实现这一点。但是,我希望能够过滤最新评估状态的结果(例如,所有那些仍处于打开状态的当前评估)。但是,如前所示(Custom properties in a query),您不能在查询中包含自定义模型属性。

我会在Trader模型中创建一个外键,记录最新评估的id,然而,这是不可能的,因为那时模型会相互引用,然后你会遇到循环排序问题创建类,即Trader引用评估,但尚未宣布评估,或者首先评估评估,但未宣布交易者。

到目前为止,我假设我将使用Trader作为我的基本查询,并查找评估。我认为解决问题的另一种方法是基于Evaluation创建查询,然后查找Traders。但是,这意味着那些尚未进行评估的交易者将永远不会出现在结果中(除非我确保交易者始终至少有一个评估记录)。或者我想我可以使用原始SQL。

有关如何解决此问题的任何建议都将不胜感激。

以下是模型:

Class Trader(models.Model):
    territory = models.ForeignKey(Territory)
    organisation_name = models.CharField(max_length=30)
    contact_title = models.CharField(choices=TITLE_CHOICES, max_length=4)
    contact_forename = models.CharField(max_length=30, blank=True)
    contact_lastname = models.CharField(max_length=30)
    ...

    def _get_current_evaluation(self):
        return Evaluation.objects.filter(trader=self).latest('open_date')

    current_evaluation = property(_get_current_evaluation)

Class Evaluation(models.Model):
    trader = models.ForeignKey(Trader)
    open_date = models.DateField("Open Date", null=True, blank=True)
    rated_date = models.DateField("Rated Date", null=True, blank=True)
    closed_date = models.DateField("Closed Date", null=True, blank=True)
    status = models.ForeignKey(RatingStatus, null=True, blank=True)
    ...

1 个答案:

答案 0 :(得分:0)

http://docs.djangoproject.com/en/dev/ref/models/querysets/#latest
http://docs.djangoproject.com/en/dev/ref/models/querysets/#order-by

  

“我想列出所有交易员   以他们目前的评估状态。“

traders = Trader.objects.all()

{% for trader in traders %}
    {{ trader }} : {{ trader.evaluation_set.latest.status|default:"Not Evaluated" }}
{% endfor %}

  

“但是,我希望能够过滤   关于状态的结果   最新评估(例如,所有   那些当前的评估   仍然开放)。“

     

“我想到了另一种方法   问题是创建一个查询   基于Evaluation,然后查找   交易员改为。但是,这意味着   那些没有过的交易员   尚未评估,将永远不会出现   结果(除非我确定   交易者总是至少有一个   评估记录)。“

如果您按照evaluate_status = open进行过滤,则无法获得尚未评估的交易者。

这样:

status = RatingStatus.get(status='open')
traders_with_open_evals = Traders.objects.filter(evaluation__status=status).distinct()

这不是必需的,但供您参考:

  

我会创建一个外键   Trader模型,记录该id   最新的评估,   但是,这是不可能的,因为   然后模型将参考每个   其他,然后你进入一个   圆形排序时的问题   创建类,即交易者指   评价,但评价没有   已经宣布或推出   首先评估,但交易者不是   声明。

<强> http://docs.djangoproject.com/en/dev/ref/models/fields/#foreignkey

  

如果您需要创建关系   在一个尚未出现的模型上   定义后,您可以使用该名称   模型,而不是模型对象   本身:

class Car(models.Model):
    manufacturer = models.ForeignKey('Manufacturer')
    # ...

class Manufacturer(models.Model):
    # ...
  

引用另一个中定义的模型   应用程序,你可以明确   指定一个完整的模型   申请标签。例如,如果   上面的制造商型号定义于   另一个叫做生产的应用   你需要使用:

class Car(models.Model):
    manufacturer = models.ForeignKey('production.Manufacturer')
  

这种参考可能很有用   在解决循环导入时   两个应用程序之间的依赖关系。