Я использую depth = 1
на моем сериализаторе, чтобы отобразить информацию о поле внешнего ключа. Тем не менее, он также показывает детали другого поля внешнего ключа, который мне действительно не нужен. Как показать детали одного поля, но не другого?Как показать глубину одного поля в Django Rest Framework?
ответ
Просто для справки
Предположим, у вас есть три модели:
class User(model.Model):
username = model.CharField('username', max_length=10)
class Question(model.Model):
title = models.CharField('title', max_length=10)
class Answer(model.Model):
user = model.ForeignKey(User)
question = model.ForeignKey(Question)
body = model.TextField('the answer body')
И вам нужно сериализация Answer
, с показывая деталь Question
, но не показывая деталь User
, то вы могли бы определите свои сериализаторы следующим образом:
class QuestionSerializer(serializers.ModelSerializer):
class Meta:
model = Question
exclude = []
class AnswerSerializer(serializers.ModelSerializer):
question = QuestionSerializer(many=False, read_only=True)
class Meta:
model = Answer
exclude = []
при сериализации Answer
с AnswerSerializer
, вы заметите, что поле question
сериализуется одновременно, однако user
поле по-прежнему целое без сериализации.
Если вам нужно сериализовать внешний ключ, вы можете явно определить поле в сериализаторе, а имя поля равно имени поля в model
, а это значение будет равно Serializer модели внешнего ключа. Когда модель сериализуется, Answer
в этом случае поле внешнего ключа, question
для этого случая, будет «расширено» с QuestionSerializer
, а в других полях внешнего ключа по-прежнему сохраняется исходное значение внешнего ключа, user
в этом случае, если вы находитесь 't явно задает поле сериализатора в сериализаторе.
Надеюсь, это поможет.
Я думаю, что вы не можете сделать это с помощью 'depth', из моего опыта я всегда настраиваю поле внешнего ключа с помощью другого сериализатора, не используя' depth', тогда вы можете контролировать, какое поле будет отображаться с деталями, а какие поле не будет. – Enix
Спасибо @Enix. Не могли бы вы дать мне ссылку, чтобы я мог следить за тем, что вы только что объяснили? – MiniGunnR