Допустим, у нас стандартное отношение 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 я нашел: Как обрабатывать отношения «многие ко многим» в RESTful API?
Дилемма заключается в том, что отношение m2m является симметричным, и я хочу иметь одну конечную точку (будетбыть менее двусмысленным) .. Как решить это для GET list for user
против GET lsit for group
?Я думаю, чтобы пойти с параметрами запроса (так как они не связаны со структурой URL, их порядок не важен):
Таким образом, URL конечной точки будет просто /groups_x_users
- GETэлемент
/groups_x_users?group=g1&user=u2
# список с одним элементом - или приведение к элементу - список GET для u1
/groups_x_users?user=u2
- список GET для g3
/groups_x_users?group=g1
ПОЛУЧИТЬ список для всех комбинаций /groups_x_users
PUT /groups_x_users
{группа: "g1", пользователь: "u2"} # или, возможно, пустая полезная нагрузка до /groups_x_users?group=g1&user=u2
?
- DELETE
/groups_x_users?group=g1&user=u2
@ m.com Для небезопасных методов следует дважды проверить, что параметры выбирают одно отношение (аналогично пакету drf-bulk ).У меня все еще есть сомнения, как обращаться с DELETE, если отношения отсутствуют - может быть, просто передать молча (как с PUT)?
ViewSet кажется возможным путем расширения ModelViewSet и переопределения get_object
и get_queryset
(или filter_queryset
).Но я не могу найти такое решение (с помощью параметра запроса) в Интернете - так что в чем могут быть недостатки использования query_params? (SEO?).
PS .: Большинство примеров DRFЯ нашел предложение сделать это через вложенный сериализатор - но это кажется слишком неуклюжим.Я хочу явно редактировать ТОЛЬКО отношения - и делать это для одного отношения (для более четкой (не) обработки проверки).