【问题标题】:How to create an endpoint for a ManyToMany relationship?如何为多对多关系创建端点?
【发布时间】:2017-08-03 22:30:30
【问题描述】:

models.py

class Author(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    email = models.EmailField(blank=True)

class Publication(models.Model):
    title = models.CharField(max_length=200)
    pub_date = models.DateField(null=True, blank=True)
    author = models.ManyToManyField(Author)

serializers.py

class AuthorSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Author
        fields = ('first_name', 'last_name', 'email')

class PublicationSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Publication
        fields = ('title', 'pub_date', 'author')

urls.py

router = routers.DefaultRouter()
router.register(r'authors', views.AuthorViewSet)
router.register(r'publications', views.PublicationViewSet)

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^api/', include(router.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

views.py

class AuthorViewSet(viewsets.ModelViewSet):
    queryset = Author.objects.all().order_by('-first_name')
    serializer_class = AuthorSerializer

class PublicationViewSet(viewsets.ModelViewSet):
    queryset = Publication.objects.all()
    serializer_class = PublicationSerializer

我想要什么

如您所见,我的两个模型(作者和出版物)以多对多关系连接。我想要的是当我转到api/authors/[id]/publications 时能够访问特定作者的所有出版物。我该怎么做?

【问题讨论】:

  • Publication.objects.filter(author__id=<id>)
  • 请更具体。我把那个代码放在哪里?我还需要添加什么才能使其正常工作?
  • 在您的 API 视图中,您的函数可能类似于 def viewFunc(request, author_id)。您需要执行该查询,该查询将返回作者贡献的所有出版物的列表。
  • 实际上我的views.py 文件中只有两个类。我编辑了我的消息以显示内容。如何调整我的代码以将您的代码与函数一起使用?
  • 看起来你应该可以编写一个自定义的list 函数来返回你想要的结果:django-rest-framework.org/api-guide/viewsets

标签: python django rest django-rest-framework


【解决方案1】:

我不确定你是否已经解决了这个问题。但这听起来很像在 DRF 文档中发现的序列化程序关系here,尤其是嵌套关系。长话短说,您的序列化程序中会包含以下内容:

class AuthorSerializer(serializers.HyperLinkedSerializer):
    publications = PublicationSerializer(many=True, read_only=True)

    class Meta:
        model = Author
        fields = ('...', 'publications',)

让我知道它是否有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多