Django rest 框架:多对多发布

Bhu*_*hal 2 django serialization django-rest-framework

我有以下型号:

class A(models.Model): 
 b = models.ManyToManyField(B)
 name = model.CharField()

class B(models.Model):
  name = model.CharField()
Run Code Online (Sandbox Code Playgroud)

应用程序中的网址:

 url(
        r'^A/(?P<pk>[a-f0-9-]+)/B/$',
        AViewSet.as_view({
            'get': 'list',
            'post': 'create',
            'put': 'partial_update',
        }),
        name='A-B',
    ),
Run Code Online (Sandbox Code Playgroud)

A应用程序中的序列化程序:

class ABSerializer(serializers.ModelSerializer):

    class Meta:
        model = A
        extra_kwargs = {
             'id': {'read_only': True},
        }
        fields = (
            'b',
        )
Run Code Online (Sandbox Code Playgroud)

问题是,当我使用 url 在 A 应用程序上调用 POST 调用时: A/{idofA}/B并发送以下数据:

{
  b : ["idofexistingB"]
}
Run Code Online (Sandbox Code Playgroud)

我收到未发送 A 的必填字段的错误。但是,此设置适用于 PUT 调用。

PUT 调用的问题在于,当我再次调用 PUT 调用时,它会用新数据覆盖 AB 关系字段中的现有数据,而不是简单地将第二个 API 调用的数据附加到第一个。

如何发布数据以便我能够将现有 B 记录与 A 记录链接?

Sij*_*ari 7

我曾经使用 PrimaryKeyRelatedField 解决了 Django 中的 manytomany 字段。它假定字段的值以列表形式出现。我希望它会对你有所帮助。

class ABSerializer(serializers.ModelSerializer):
    b = serializers.PrimaryKeyRelatedField(many=True, read_only=True)

class Meta:
    model = A
    fields = ('name', 'b')


 {'name': 'test', 'b': [1, 2]}
Run Code Online (Sandbox Code Playgroud)