Я использую DRF с Django.
Я хотел бы вернуть объект с полями (Автор) в ответе API и иметь возможность обновить эту модель.
Со следующим списком кодов работает нормально:
class AuthorSerializer(serializers.ModelSerializer):
class Meta:
model = Author
fields = ('id', 'name')
class SiteSerializer(serializers.ModelSerializer):
class Meta:
model = Site
fields = ('id', 'name')
class VersionSerializer(serializers.ModelSerializer):
author = AuthorSerializer(many=False, required=False)
site = PrimaryKeyRelatedField(queryset=Site.objects.all(), required=False)
class Meta:
model = Version
fields = ('id', 'name', 'site', 'author')
class VersionViewSet(viewsets.ModelViewSet):
serializer_class = VersionSerializer
queryset = Version.objects.all()
def get_queryset(self):
site_id = self.request.query_params.get('site')
if site_id:
site = Site.objects.get(id=site_id)
return self.queryset.filter(site=site).all()
Маршрутизатор по умолчанию для наборов просмотра
Когда я запрашиваю детали версии 1, я получаю:
{
"id":"1",
"name":"A",
"site":"1",
"author": {
"id": 1,
"name": "Author A"
}
}
Это выглядит так, как я хочу.
При обновлении обновляются все поля, но не автор.
Если я переключаю в VersionSerializer на:
author = PrimaryKeyRelatedField(queryset=Author.objects.all(), required=False)
Все будет работать, но тогда я получу ответ на этот вопрос
{
"id":"1",
"name":"A",
"site":"1",
"author": 1
}
, который потребует еще один запрос сведений об авторе.
Я бы предпочел, чтобы API возвращал все поля, необходимые для отображения в одном запросе.
Я нашел способ, но он довольно грязный, я уверен, что должен быть лучший способ. На данный момент я обновил VersionViewSet:
def update(self, request, *args, **kwargs):
author_id = request.data.get('author')
if author_id:
version = Version.objects.get(pk=kwargs['pk'])
version.author = Author.objects.get(pk=author_id)
version.save()
return super(VersionViewSet, self).update(request, *args, **kwargs)
Есть подсказки?
Спасибо!