假设我们具有标准的auth.contrib users <<-->> groups
关系。
我已经创建了User
和Group
实例,并且想CRUD 仅关系:
序列化器可能是这样的:
class Serializer(ModelSerializer):
group = SlugRelatedField(slug_field='name', queryset=Group.objects.all())
user = SlugRelatedField(slug_field='email', queryset=User.objects.all())
class Meta:
model = Group_x_User
我找到的最接近REST API的建议是:How to handle many-to-many relationships in a RESTful API?
难题在于,m2m关系是对称的,我希望具有单个端点(将减少歧义)。如何针对GET list for user
和GET lsit for group
来解决它?我认为可以使用查询参数(因为它们不绑定到url结构,所以它们的顺序并不重要):
因此,端点网址将仅为/groups_x_users
/groups_x_users?group=g1&user=u2
#列表-或强制转换为项目/groups_x_users?user=u2
的列表/groups_x_users?group=g1
的列表获取所有组合/groups_x_users
PUT /groups_x_users
{group:“ g1”,user:“ u2”}#或可能是/groups_x_users?group=g1&user=u2
的空有效载荷?
/groups_x_users?group=g1&user=u2
@ m.com
对于不安全的方法,应再次检查该参数以选择单个关系(类似于drf-bulk package中的关系)。
我仍然有疑问,如果不存在关系该如何处理DELETE-也许只是默默地传递(与PUT一样)?通过扩展ModelViewSet并覆盖get_object
和get_queryset
(或filter_queryset
),似乎可以实现ViewSet。
但是我在Web上找不到这样的解决方案(通过查询参数),因此使用query_params可能有什么弊端?(SEO?)。
PS .:我发现的大多数DRF示例都建议通过嵌套序列化程序来完成,但这似乎太笨拙了。我想显式地编辑唯一的关系-并针对每个关系进行此操作(以进行更清晰的验证处理)。