Django Rest Framework:如何附加到数组

Django Rest Framework: How to Append to array

我有一个用户对象,我想将新朋友添加到他们现有的朋友列表中。如果下面是 user1 的现有朋友列表,我如何 POST/PUT 一个新朋友到现有列表而不重新发布整个朋友列表。

    {
        "friends": [
            {
                "first_name": "Bob" 
            },
            {
                "first_name": "Dave" 
            },
            {
                "first_name": "Jon" 
            }

        ],
       "first_name": "User1", 
    }

我的 JSON 在 POST 中会是什么样子,我必须在 DRF 端做什么才能更新此数组而无需重新发布现有数组。

我尝试POST以下但它只是覆盖了整个朋友列表

PATCH /api/profile/55522221111/ HTTP/1.1
{"friends":[{"first_name":"new friend"}]}

您最好创建一个新端点,例如:

POST /api/profile/555222211111/friends/add/
{
    "first_name": "new_friend"
}

您的策略的替代方法可能是重新定义您的模型,以便创建数组中内部对象的 one-to-many 引用,在您的示例中,其中包含 {"first_name": "Bob"} 到主对象.

这将允许您 post 只需在模型中提及外键即可进入朋友数组。

类似于:

models.py

class User(models.Model):
    first_name    = models.CharField(max_length=64)

class Friend(models.Model):
    first_name    = models.CharField(max_length=64)
    user          = models.ForeignKey(User, related_name='friends')

serializers.py

class FriendSerializer(serializers.ModelSerializer):

    class Meta:
        model = Friend
        fields = ('id', 'first_name', )


class UserSerializer(serializers.ModelSerializer):
    friends = FriendSerializer(many=True)

    class Meta:
        model = User
        fields = ('id', 'first_name', 'friends', )

views.py

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

class FriendViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = FriendSerializer

urls.py

router = routers.DefaultRouter()
router.register(r'users', UserViewSet)
router.register(r'friends', FriendViewSet)

urlpatterns = [
    url(r'^api/', include(router.urls)),
]

这应该会产生 2 个网址,例如 (1) /api/users/(2) /api/friends/,您可以 post 进入 (2),如果引用正确,它将按您的意愿显示在 (1).

{
    "friends": [
        {
            "first_name": "Bob" 
        },
        {
            "first_name": "Dave" 
        },
        {
            "first_name": "Jon" 
        }

    ],
   "first_name": "User1", 
}