Django Rest Framework 不保存对多对多的引用

标签 django django-rest-framework

我有一个具有多对多关系(NotificationGroups)的模型(通知)。序列化来自模型的数据与 DRF 配合得很好,但是当我想保存到引用多对多关系的通知时,我什么也得不到。

型号:

class Notifications(models.Model):
    notification = models.CharField(max_length='125')
    groups = models.ManyToManyField('NotificationGroups')

class NotificationGroups(models.Model):
    name = models.CharField(max_length='100')

序列化器:

class NotificationGroupSerializer(serializers.ModelSerializer):
    class Meta:
        model = NotificationGroups
        fields = ('id', 'name',)

class NotificationSerializer(serializers.ModelSerializer):
    groups = NotificationGroupSerializer(many=True, read_only=True)

    class Meta:
        model = Notifications
        fields = ('id', 'notification', 'groups',)

请求的 JSON 正文:

{
   "notification":"This is a test from the API",
   "groups":[
      {
         "id":1
      },
      {
         "id":3
      }
   ]
}

View 集:

def create(self, request):
    serializer = NotificationSerializer(data=request.data)

    if serializer.is_valid(raise_exception=True):
        print serializer.validated_data

        return Response(serializer.data, status=status.HTTP_201_CREATED)

当我保存时,没有为通知组保存任何内容。我现在正在 ViewSet 中打印经过验证的数据只是为了测试,但我没有获得任何组数据。

我意识到我在这里遗漏了一些明显的东西,但我无法找到我的问题。我能找到的所有示例都讨论将多对多数据写入新数据,而不是根据我需要在这里引用它。

编辑并修复:

序列化器:

class NotificationGroupSerializer(serializers.ModelSerializer):
    class Meta:
        model = NotificationGroups
        fields = ('id', 'name',)

class NotificationSerializer(serializers.ModelSerializer):
    class Meta:
        model = Notifications
        fields = ('id', 'notification', 'groups',)

请求的 JSON 正文:

{
   "notification":"This is a test from the API",
   "groups":[1, 3]
}

最佳答案

您需要更改序列化器中的createupdate 函数。默认情况下,DRF 不支持可写嵌套序列化器。

http://www.django-rest-framework.org/api-guide/serializers/#writable-nested-representations

关于Django Rest Framework 不保存对多对多的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39391423/

相关文章:

python - 从同一目录导入python文件时导入错误

django - 如何在 django 管理字段中添加自定义 html?

python - 有人能解释一下 django 中 "etag"有什么用吗?

python - 具有多个网址的站点地图和对象

python - 使用 django 序列化程序将数据保存在数据库中的更好方法

python - 使用 django rest 框架按名称返回信息

python - 使用 Django 和单一网页模板在数据库中存储网页内容的最佳方法

python - Django Rest 框架的 ModuleNotFoundError

django - 在 django 上以 json 形式查看 500 上的错误堆栈跟踪

python - 如何在 Django REST Framework 中将搜索参数添加到 GET 请求?