Python Django多对多关系,包括queryset中双向的所有ID
我有两个模型通过M2M关系连接Python Django多对多关系,包括queryset中双向的所有ID,python,django,django-2.2,Python,Django,Django 2.2,我有两个模型通过M2M关系连接 课堂论文(models.Model): title=models.CharField(最大长度=70) 作者=模型.ManyToManyField(B,相关论文) 类作者(): name=models.CharField(最大长度=70) 是否有办法将作者包括为所有相关作者的ID(可能还有名字) 有没有办法将论文ID作为反向关系(可能还有标题)包含在内 Author.objects.all().annotate(相关论文=F('papers')) 这只
课堂论文(models.Model):
title=models.CharField(最大长度=70)
作者=模型.ManyToManyField(B,相关论文)
类作者():
name=models.CharField(最大长度=70)
- 是否有办法将
包括为所有相关作者的ID(可能还有名字)作者
- 有没有办法将
ID作为反向关系(可能还有标题)包含在内论文
Author.objects.all().annotate(相关论文=F('papers'))
这只增加了一张纸的id,我想这是它找到的第一张
此外,将相关论文
更改为论文
会产生错误:
实际上,它已经为您实现了。您应该在您的论文模型中包含与作者的多对多关系,如下所示:
class Paper(models.Model):
title = models.CharField(max_length=70)
authors = models.ManyToManyField(Author, related_name='papers')
这使您有机会使用将Author
对象添加到相关集合中
p.authors.add(u)
,假设p
是论文
模型的对象,a
是作者
模型的对象
- 您可以使用
访问p.authors.all()
实例的所有相关作者论文
- 您可以使用
访问u.papers.all()
实例的所有相关论文作者
QuerySet
实例
请参阅本页了解更多信息。根据我在您评论中的理解,您正在使用DRF。我会给你两个答案 1)如果您正在谈论模型序列化程序,您可以使用:
类编写器序列化程序(serializers.ModelSerializer):
papers=serializers.PrimaryKeyRelatedField(many=True,read\u only=True)
类元:
模型=作者
字段=['name','papers']
类PaperSerializer(serializers.ModelSerializer):
类元:
模型=纸张
字段='\uuuu所有\uuuu'
这将返回关系另一方的ID,无论您是在纸上还是在作者端。这将返回主键,而不是对象本身的表示
2)现在您也在谈论性能(例如,每次迭代时数据库命中率)
Django(不特定于DRF)有一个queryset方法来处理预加载相关对象。它叫
例如,如果您知道需要关系对象属性并希望避免重新查询数据库,请执行以下操作:
Author.objects.all().prefetch_相关('papers'))
#论文将已经加载,因此,如果您对它们进行迭代,则不需要再次访问数据库。
不确定您想要什么。您只需使用您的\u author.papers.all()
或您的\u papers.authors.all()
即可访问关系。它已经可以从.all()
查询中访问,并创建papers字段(以及错误)。我正在尝试在django rest framework API中返回ID。据我所知,在文件上有一个键,其中有许多相关管理人员。此管理器是否仅在访问m2m密钥的内容时运行查询?那么drf是否对每个对象的每个m2m密钥运行查询?那么,对行中的每一项进行查询?这会变得非常慢PrimaryKeyRelatedField
和prefetch\u related
一起工作非常好!谢谢:)prefetch\u related
特别是将查询时间从1.5秒缩短到300分钟这是在查询集上进行注释或迭代的常见错误<代码>预回迁相关的
(多/一对多)和选择相关的
(一/多对一)对于关系都很重要。
class Paper(models.Model):
title = models.CharField(max_length=70)
authors = models.ManyToManyField(Author, related_name='papers')