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",
}
我有一个用户对象,我想将新朋友添加到他们现有的朋友列表中。如果下面是 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",
}