我试图根据两个模型之间的关系构建查询集。下面是它们的样子:
class Foo(models.Model):
name = models.CharField(max_length=150)
date = models.DateTimeField(editable=False)
...
class Meta:
ordering = ['-date']
class Bar(models.Model):
foo = models.OneToOneField(Foo, related_name='bars')
from_date = models.DateTimeField(editable=False)
class Meta:
ordering = ['from_date']
现在我需要Foo
对象的查询集,但首先我想要有存在于Bar
模型中的对象,具有Bar默认排序,然后Foo
对象的其余部分具有Foo排序。
q = Foo.objects.all().order_by('bars','-date').distinct()
同样有趣的是,我在django1.5和django1.6中对上面的查询集有不同的排序。
你只需要Foo对象有一个Bar对象链接到他们,这意味着:过滤器。
Foo.objects.filter(bars__isnull=False)
但这只会按照Foo日期的默认顺序排序。
要得到您想要的,您需要在这个查询集
Foo.objects.filter(bars__isnull=False).order_by('bars', '-date')
我不确定order_by('bars'
)做。它是按特定的文件(from_date)还是按id排序?
我用django 1.6测试,order_by是在右字段(from_date)上完成的,所以可能django 1.5在id而不是特定的字段上做了order_by,因此不同的排序?
您可以强制文件选择是否需要在两个版本上兼容,或者只是为了可读性。
Foo.objects.filter(bars__isnull=False).order_by('bars__from_date', '-date')
另一点
因为你们的关系是一对一的,所以related_name
不应该有最后的s (bar而不是bars)。这将澄清你的代码,因为django对待OneToOne关系和其他关系有一点不同。
事实上,如果你有一个ForeignKey
关系,你必须这样做,得到一个(或全部)Bar对象:
foo = Foo.objects.get(id=1)
bars = foo.bars.all()
对于OneToOne
,你只需要这样做:
foo = Foo.objects.get(id=1)
bar = foo.bar
差异是由于OneToOne关系确保Foo对象被链接到一个且只有一个Bar对象,与ForeignKey关系一个Foo对象可以有一个或多个Bar对象链接到它。