我有一个简单的分层模型,一个是Person,另一个是RunningScore。 这个模型存储了许多用户运行得分的数据,简化了如下:
class Person(models.Model):
firstName = models.CharField(max_length=200)
lastName = models.CharField(max_length=200)
class RunningScore(models.Model):
person = models.ForeignKey('Person', related_name="scores")
time = models.DecimalField(max_digits=6, decimal_places=2)
如果我得到一个人,它会附带与之关联的所有RunningScores,这是标准行为。我的问题很简单:如果我想让一个只有一个RunningScore孩子的人(假设结果更好,也就是min(时间))我该怎么办? 我阅读了官方Django文档,但没有找到 溶液
答案 0 :(得分:0)
如果我明白你的意思,我不是百分百肯定,但也许这会有所帮助:
from django.db.models import Min
Person.objects.annotate(min_running_time=Min('time'))
查询集将获取具有min_running_time
附加属性的Person对象。
您还可以添加过滤器:
Person.objects.annotate(min_running_time=Min('time')).filter(firstName__startswith='foo')
访问第一个对象的min_running_time
属性:
first_person = Person.objects.annotate(min_running_score=Min('time'))[0]
print first_person.min_running_time
编辑:
您可以定义方法或属性(如下所示)以获取相关对象:
class Person(models.Model):
...
@property
def best_runner(self):
try:
return self.runningscore_set.order_by('time')[0]
except IndexError:
return None
答案 1 :(得分:0)
如果您只想为一个Person创建一个RunningScore,则可以使用odering并将查询集限制为1个对象。 像这样:
Person.runningscore_set.order_by('-time')[0]
以下是限制查询集的文档:
https://docs.djangoproject.com/en/1.3/topics/db/queries/#limiting-querysets