Django:prefetch_相关结果按中间表的字段排序

标签 django orm many-to-many has-many-through graph-databases

如何在 Django 中预取相关对象并按中间表中的字段对它们进行排序?

这是我正在使用的模型:

class Node(models.Model):
    name = models.CharField(max_length=255)
    edges = models.ManyToManyField('self', through='Edge', symmetrical=False)


class Edge(models.Model):
    from_node = models.ForeignKey(Node, related_name='from_node')
    to_node = models.ForeignKey(Node, related_name='to_node')

    weight = models.FloatField(default=0)

给定一个节点,我想预取所有相关节点,按权重排序。

当我使用此查询时:

n = Node.objects.prefetch_related('to_node').order_by('edge__weight').get(name='x')

order_by 没有效果。

编辑:

迄今为止我最好的答案

n = Node.objects.get(name='x')
edges = Edge.objects.filter(from_node=n).prefetch_related('to_node').order_by('weight')

然后,我不再迭代 n.edges (如我所愿),而是迭代 edges.to_node

最佳答案

现在,您还可以使用 Prefetch 类来实现此目的:

https://docs.djangoproject.com/en/1.10/ref/models/querysets/#django.db.models.Prefetch

或者,如果您想默认始终执行此操作,您可以查看中间表上的元排序,例如:

class SomeThroughModel(models.Model):
    order = models.IntegerField("Order", default=0, blank=False, null=False)
    ...

    class Meta:
        ordering = ['order']  # order is the field holding the order

关于Django:prefetch_相关结果按中间表的字段排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14904525/

相关文章:

c# - 使用多对多 linq 数据填充类

php - 一次更新多对多连接器表

java - Hibernate 多对多关联 : left hand side collection contains elements, 但右侧集合为空

python - 表单集、外键和 OneToOne

django - - 尝试加载大于 72 MB 的视频时管道破裂

php - Kohana 2.3.4 ORM - 删除数据透视表关系

java - SwarmCache Hibernate 配置

jquery - 链接在加载后保持粗体

Django 表单未使用 ModelChoiceField 保存 -foreignkey

php - Controller 与模型——需要解释