如何在 django-rest 中处理 M2M 关系

2024-05-19

让我们从 django 文档中使用的有关 M2M 关系的模型开始,该模型使用 through 参数来指向将充当中介的模型。

class Person(models.Model):
    name = models.CharField(max_length=128)

    def __unicode__(self):
        return self.name

class Group(models.Model):
    name = models.CharField(max_length=128)
    members = models.ManyToManyField(Person, 
                                     through='Membership')

    def __unicode__(self):
        return self.name

class Membership(models.Model):
    person = models.ForeignKey(Person)
    group = models.ForeignKey(Group)
    date_joined = models.DateField()

    class Meta:
        ordering = ['date_joined']

假设现在我想休息一下读写组模型的视图,其中还包含每个组内的所有人员,按 date_joined 字段排序。我想要获得的 json 序列化如下(成员仅用其 id 进行描述):

{
    "id": 1, 
    "name": "U2", 
    "members": [
       20, 
       269, 
       134, 
       12,
    ]
}

我写了一个序列化器:

class GroupSerializer(serializers.ModelSerializer):
    members = serializers.SlugRelatedField(source='membership_set', 
                                           many=True, 
                                           read_only=False,
                                           slug_field='person_id', 
                                           required=True)

    class Meta:
        model = Group
        fields = ('id', 'name', 'members')

虽然对于读取操作它效果很好,但对于写入操作则不然。我应该如何定义序列化器,以便根据上面定义的序列化,它将继续:

  1. 创建组对象
  2. 将每个成员添加到组中(通过创建 Membership 对象)

From here http://www.django-rest-framework.org/api-guide/relations#manytomanyfields-with-a-through-model您可以看到您尝试执行的操作仅适用于读取操作。这是 DRF 的一个常见问题,正如其创建者 Tom Christie 在this https://groups.google.com/forum/#!msg/django-rest-framework/vCl2I_EzJnE/qwRdIdxiUe4J评论。

另外,对于你想要的JSON序列化,建议使用PK相关字段,如图here http://www.django-rest-framework.org/api-guide/relations#primarykeyrelatedfield,尽管这对创建 Group 对象和添加成员没有帮助。您必须自己编写该代码。

希望这可以帮助。

Edit

通过创建成员资格将每个人添加到组中的代码片段:

def post_save(self, obj, created=False):
    # obj represents the Group object
    if created:
        # Test to see if the Group was successfully created
        members = self.request.DATA.get('members', None)
        if members not None:
            for id in members:
                person = Person.objects.get(id=id)
                membership, m_created = Membership.objects.get_or_create(person=person, group=obj)
                # Here you can use m_created to see if the membership already existed and to do whatever else you need.

此实现假设您已声明 date_joinedauto_now。如果没有,您也应该将其作为参数传递。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 django-rest 中处理 M2M 关系 的相关文章

随机推荐

  • HTML 下拉菜单禁用 Javascript 中的选项

    Question 下面的代码是隐藏所选项目下拉列表中的选项 因此 当用户选择该选项时 它将隐藏所有下拉选择列表中的所选值 我现在有四个下拉选择 我想实现像当下拉选择被触发时它将启用当前选择的选项值 意味着用户能够在用户触发时选择回下拉选择中
  • 无法执行 Android 活动的方法

    我有以下按钮
  • Android 上的 SQLite 和 MongoDB 具有同步功能

    是否可以在 Android 上使用 SQLite 在服务器上使用像 MongoDB 这样的 NoSQL 数据库 并在两者之间进行 2 路数据复制 同步 或者最好在两端使用 SQL 或者在两端使用 NoSQL 但不要混合使用 有几种不同的方法
  • 将 HTML 'label' 标签与单选按钮一起使用

    是否label标签与单选按钮一起使用吗 如果是这样 你如何使用它 我有一个显示如下的表单 First Name text field Hair Color color drop down Description text area Salu
  • 高效地重新安排 ActiveJob (resque/sidekiq)

    我正在玩Rails 4 2应用程序使用ActiveJob受支持resque sidekiq用于电子邮件安排 当用户创建时事通讯活动时 会创建一个新作业并安排在特定日期 这一切都很好 但是当用户更改交货日期时会发生什么 在这种情况下 每个作业
  • C# ASP.NET MVC:视图中的单行 If 子句?

    我遇到了一个小问题 并且无法解决它 我的看法是这样的 Try or
  • 序列化和反序列化 HttpRequestMessage 对象

    有人有序列化 HttpRequestMessage 对象的经验吗 尝试使用 Json net 它部分有效 也就是说 JsonConvert DeserializeObject 由于 StringContent 构造问题而失败 无法找到用于类
  • Java 模 2**64 求逆

    给定一个奇数long x 我在找long y这样他们的乘积模2 64 即 使用正常的溢出算术 等于 1 为了明确我的意思 这可以在几千年内计算出来 for long y 1 y 2 if x y 1 return y 我知道可以使用扩展欧几
  • 收到警告“标头不能包含多个标头,检测到新行”

    我正在用 oops 进行编码 以便用 PHP 上传图像 但是提交图片后却出现警告 标题不能包含多个标题 检测到新行 下面是我的函数 它给出了错误 public function ft redirect query if REQUEST UR
  • Visual C++ 找不到“Windows 类型”,如 PVOID、DWORD、ULONG 等

    Windows 似乎无法找到任何这些类型 我完全不知道该怎么办 我在 MSDN 上找到的东西似乎表明它们是默认包含的 但它们在 Native 程序或 CLR 程序中不起作用 我收到的具体错误是
  • 选择框属性更改时未触发 Webkit Mutation Observer 回调

    我正在尝试监视选择框 或嵌套的option元素 与新的变异观察者 http updates html5rocks com 2012 02 Detect DOM changes with Mutation Observers功能 然而 只有
  • 在转到另一个活动之前需要 editText 字段

    我有验证editText 如果editText字段为空 它应该会失败验证并阻止用户转到另一个字段Activity 因为需要一个值 怎么做 我知道这是一个基本问题 但我不知道如何做到这一点 My code btninsert Button f
  • 在 React Native 中从父组件调用子函数

    我正在开发我的第一个 React Native 应用程序 我想要实现的是从父组件执行子函数 情况如下 Child export default class Child extends Component myfunct function c
  • 如何将一个变量的字符串分配给另一变量?

    这是我在这个网站上的第一个问题 如何将一个变量的字符串分配给另一变量 我在这里做错了什么 include
  • Vaadin 网格表:如何禁用排序功能并设置一列的颜色

    我在用着GridVaadin 中的表用于数据表示 为此 我试图弄清楚以下两个问题 1 如何禁用每列标题中的排序功能 2 如何设置表格中某一列的颜色Grid table 首先 我找到了Vaadin 文档 https vaadin com do
  • 使用 ng-table 角度计算列的总和

    我正在使用 Angular ng table 以表格形式绘制数值数据 我无法弄清楚如何在表末尾引入一行 该行显示每列所有值的总和 我可以在服务器端计算数据并将其呈现在用户界面中 但有没有办法在 ng table ng grid 中实现这一点
  • 在 grunt 中禁用 livereload (yeoman)

    当我运行 gruntserve 时 它 会自动在 index html 中注入以下代码 我不希望这种事发生 我该如何禁用它 我尝试了所有提到的选项here https stackoverflow com questions 12830159
  • Python 中的 grep 等价物是什么?

    假设我有一个文本文件 其中包含 我喜欢大象 这一行 如果我捕获所述文件并将其通过管道发送到 grep大象 我会得到整行 我喜欢大象 如何使用 re 在 Python 中实现此功能 我一直在尝试以下方法 test re search elep
  • 使用 React.js + Express.js 发送电子邮件

    我在 ES6 中使用 React js 构建了一个 Web 应用程序 我目前想要创建一个基本的 联系我们 页面并想要发送电子邮件 我是 React 新手 刚刚发现我实际上无法使用 React 本身发送电子邮件 我正在遵循教程nodemail
  • 如何在 django-rest 中处理 M2M 关系

    让我们从 django 文档中使用的有关 M2M 关系的模型开始 该模型使用 through 参数来指向将充当中介的模型 class Person models Model name models CharField max length