Django rest framework — вложенные объекты?

Есть модель с внешним ключем:

class Ticket(models.Model):
    name = models.CharField(max_length=255)
    text = models.TextField(blank=True)
    author = models.ForeignKey(settings.AUTH_USER_MODEL)


И соответственно сериалайзеры:
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = get_user_model()

class TicketSerializer(serializers.ModelSerializer):
    class Meta:
        model = Ticket


В списке результатов по запросу тикетов хотелось бы получать результат сразу с подставленным автором, вот таким образом
[
        {
            "id": 1,
            "author": {
                "first_name": "",
                "id": 1,
                "last_name": "",
                "middle_name": "",
                "is_active": true,
                "username": "admin",
                "role": 1,
                "full_name": "admin",
                "email": "admin@example.com",
                "active_unitl": null
            },
            "assignee": null,
            "name": "",
            "text": "",
            "deadline": null,
            "priority": 2,
            "status": 3,
            "progress": 0,
            "created": "2015-06-25T07:50:48Z",
            "modified": "2015-06-25T07:50:48Z",
        }
    ]


Этого можно добиться если указать поле author = UserSerializer():
class TicketSerializer(serializers.ModelSerializer):
    class Meta:
        model = Ticket

    author = UserSerializer()


Однако при этом возникакет проблема с create/update.
Без этого поля все работает как надо, отправляешь id автора и все работает:
{
            "author": author.id,
            "name": "делай что-нибудь",
            "text": "по ТЗ",
            "deadline": "2015-06-25",
            "priority": 2,
}

А с author = UserSerializer(), так уже не работает, надо переопределять методы create/update.

И тут не ясно что делать, толи методы create/update переопределять, толи использовать два сериалайзера, для чтения и записи. Ни то не другое не кажутся хорошими решениям, кажется это должно все из коробки работать.
  • Вопрос задан
  • 2539 просмотров
Решения вопроса 1
dunmaksim
@dunmaksim
Технический писатель
Создайте два сериализатора - TicketReadSerializer и TicketWriteSerializer:
class TicketWriteSerializer(serializers.ModelSerializer):

    author = serializers.PrimaryKeyRelatedField(
        queryset=get_user_model().objects.all(),
        default=serializers.CurrentUserDefault()
    )

    class Meta:
        model = TicketModel


class TicketDetailReadSerializer(serializers.ModelSerializer):

    author = UserSerializer()

    class Meta:
        model = TicketModel

Затем в представлении (я использую ClassBasedViews) переопределяем метод get_serializer_class:
def get_serialaizer_class(self):
    if self.request.method == 'GET':
        return TicketReadSerializer
    return TicketWriteSerializer

P. S. Вижу, не мне одному интересен DRF, и есть потребность в качественных статьях на русском языке.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы