Django Rest Framework возвращает и обновляет связанную модель - PullRequest
0 голосов
/ 27 февраля 2020

Я использую 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)

Есть подсказки?

Спасибо!

...