Django查询集在第二个模型中以OneToOne字段的形式存在



我试图根据两个模型之间的关系构建查询集。下面是它们的样子:

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日期的默认顺序排序。
要得到您想要的,您需要在这个查询集

上有order_by。
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对象链接到它。

相关内容

  • 没有找到相关文章

最新更新