1

我需要从多对多查询中检索一个值。假设我有 3 个模型:Toy、Part 和 ToyParts

ToyParts 有一个名为“part_no”的字段。我需要能够得到这个的价值。

class Toy(models.Model):
    parts = models.ManyToManyField(Part, through="ToyParts")

class Part(models.Model):
    pass

class ToyParts(models.Model):
    toy = models.ForeignKey(Toy, ...)
    part = models.ForeignKey(Part, ...)
    part_no = models.CharField(...)

我试过使用:

toy.parts.all().first().part_no

这显然不起作用,因为 Part 没有名为“part_no”的字段

我也尝试过简单地使用:

ToyParts.objects.filter(toy=..., part=...)

但这会增加额外的查询。

part_no如果不直接查询 ToyParts ,我怎么能得到?

4

1 回答 1

0

我试过使用:toy.parts.all().first().part_no

part_no字段在模型上声明ToyParts。因此,您需要获取一个实例ToyParts才能访问此字段。假设您有一个Toy实例,您可以使用与 的反向关系ToyParts,默认为toyparts_set,如下所示:

toy.toyparts_set.first().part_no

part_no如果不直接查询 ToyParts ,我怎么能得到?

你不能。如果要减少可以使用的查询数量select_related

for tp in toy.toyparts_set.select_related('part').all():
    print(tp.part_no, tp.part.id)

在这个例子tp.part中不需要额外的查询,因为部件实例已经被select_related.

于 2019-08-08T09:26:19.420 回答