Django DRF model 多对多手动指定,表序列化问题.

2018-03-28 23:02:43 +08:00
 lsl

django DRF 字段多对多,"through='Membership'"手动指定表.通过 serializers.ModelSerializer 序列化 Group 表后,不能在 Group 下对"members "多对多的数据进行添加,"members"该字段属性显示"read_only": true.我找了一天没找到解决办法,请求帮助! 另外发现如果 ManyToMany 的表是自动生成的就没有这个问题.

#model.py
from django.db import models


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

    def __str__(self):
        return self.name


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

    def __str__(self):
        return self.name


class Membership(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    group = models.ForeignKey(Group, on_delete=models.CASCADE)
    date_joined = models.DateField()
    invite_reason = models.CharField(max_length=64)


#serializers.py
from rest_framework import serializers
from .models import Group


class GroupSerializer(serializers.ModelSerializer):
    class Meta:
        model = Group
        fields = ('name','members')


#views.py
from django.shortcuts import render
from rest_framework import viewsets
from .models import Group,Membership
from .serializers import GroupSerializer
# Create your views here.


class GroupViewSet(viewsets.ModelViewSet):
    queryset = Group.objects.all()
    serializer_class = GroupSerializer

3922 次点击
所在节点    问与答
3 条回复
dalang
2018-03-29 00:07:47 +08:00
```
By default, relational fields that target a ManyToManyField with a through model specified are set to read-only.

```

我觉得比较好的做法是自己为 members 写一个 custom field 类型,然后在这个类型里处理,write 的话,应该需要自己写 to_internal_value
lsl
2018-03-29 09:11:04 +08:00
感谢回复,Django Restful Framework 目前学的还不够深,我就是奇怪为什么 ManyToManyField 自动生成的表,同样是用 ModelSerializer 序列化,"members"该字段属性就是"read_only": false;而手动指定中间表序列化"read_only": true. 官方文档中说的"By default, relational fields that target a ManyToManyField with a through model specified are set to read-only. "是不是意味手动指定中间表那么该字段属性就是"read_only": true.
hiths
2018-09-03 00:44:50 +08:00
Membership 里面加一个 class Meta: auto_created = True

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/442284

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX