【问题标题】:Exposing a many to many field using Django REST Framework?使用 Django REST 框架公开多对多字段?
【发布时间】:2014-02-20 20:57:15
【问题描述】:

我正在创建一个使用 Django REST 框架的事件跟踪/注册系统,但不知道如何正确设置它。

在我的事件模型中,我有:

followers = models.ManyToManyField(get_user_model(), related_name='following')

理想情况下,经过身份验证的用户可以使用 POST 或 PATCH 在给定事件的关注者记录中添加或删除自己。虽然我不确定最好的方法是什么。

我目前的想法是创建一个仅公开关注者字段的序列化程序,然后使用该序列化程序创建一个 APIView,并在 get 和 post/patch 方法中登录以添加或删除特定用户。

我感觉这太复杂了。有没有更简单的方法来做到这一点?

【问题讨论】:

    标签: django rest django-rest-framework


    【解决方案1】:

    您如何看待对 M2M 关系使用“通过”模型?

    我的意思是:

    class Follower(...:
      user = FK user
      event = FK event
    
    ...
    followers = models.ManyToManyField(get_user_model(), through=Follower ...)
    ...
    

    在这种情况下,您可以快速创建模型序列化程序和模型 Follower 的通用视图。为了在事件中添加或删除用户,您只需向该资源发送 POST 或 DELETE 请求

    【讨论】:

    • 这是我最终要做的,也是我特别想避免的。出于各种其他原因,我想避免使用单独的模型,但看起来我不能。
    • 对我来说,当你有一个新的追随者而不是使用 PATCH 时,POST 看起来更好更清晰。此外,您始终拥有单独的模型,默认情况下它只是隐式的。
    • 是的,不幸的是,多对多关系总是使用中介模型。有一些骇人听闻的解决方案,包括将多个索引压缩到单个字符串字段等。它们普遍都很糟糕,你不应该这样做!
    • @Shayne,是的,当然总有一个中间模型,我的回答并没有相反的说法。默认情况下,Django 隐式创建这样的模型。在我的回答中,我建议通过使用“通过”参数明确表示该模型,以简化为此模型创建序列化程序/视图。
    • @AndreyKaygorodov ,我正在回复 jmickela 的评论
    猜你喜欢
    • 2013-01-22
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 2018-01-15
    • 2022-11-20
    • 2018-10-15
    相关资源
    最近更新 更多