Я пытаюсь создать объект API Roster, в котором в качестве подобъекта есть список членов. Однако я не хочу обновлять подобъект путем частичного обновления объекта реестра - вместо этого я хочу маршрут для «добавления члена» и «удаления члена».
Цель:
GET /Roster/{ROSTERID}
тело ответа:
{
id: {roster id},
members: # members sub object is read only
[
{member subobject},
{member subobject},
...
],
}
POST /Roster/{RosterID}/AddMember
{
{member id},
{member id}, ...
}
, а затем аналогичная вещь для удаления члена.
Примечание. Я хочу иметь возможность передавать существующий идентификатор участника. Я не хочу создавать новых членов здесь.
Что я должен искать в документах, чтобы иметь возможностьдобавить маршрут для обновления списка участников с идентификатором пользователя, вместо того, чтобы передавать весь пользовательский объект?
serializers.py
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['url', 'username', 'email', 'groups']
class RosterSerializer(serializers.ModelSerializer):
members = serializers.ListField(
child=UserSerializer()
)
class Meta:
model = Roster
fields = ('id', 'name', 'members')
depth = 2
app/models.py
class Members(User):
on_pto = models.BooleanField(default=False)
class Roster(models.Model):
objects = models.Manager()
name = models.CharField(max_length=80, blank=True, default='', unique=True, null='')
members = models.ForeignKey(
Members,
limit_choices_to={'on_pto': False},
blank=True,
null=True,
related_name='members',
on_delete=models.CASCADE
)
views.py
class UserViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows users to be viewed or edited.
"""
queryset = User.objects.all().order_by('-date_joined')
serializer_class = UserSerializer
class GroupViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows groups to be viewed or edited.
"""
queryset = Group.objects.all().order_by('-id')
serializer_class = GroupSerializer
class RosterViewSet(viewsets.ModelViewSet):
""""""
queryset = Roster.objects.all().order_by('-id')
serializer_class = RosterSerializer