Python Django多对多关系,包括queryset中双向的所有ID

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')) 这只

我有两个模型通过M2M关系连接

课堂论文(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')