2016-11-11 5 views
1

Я использую depth = 1 на моем сериализаторе, чтобы отобразить информацию о поле внешнего ключа. Тем не менее, он также показывает детали другого поля внешнего ключа, который мне действительно не нужен. Как показать детали одного поля, но не другого?Как показать глубину одного поля в Django Rest Framework?

+0

Я думаю, что вы не можете сделать это с помощью 'depth', из моего опыта я всегда настраиваю поле внешнего ключа с помощью другого сериализатора, не используя' depth', тогда вы можете контролировать, какое поле будет отображаться с деталями, а какие поле не будет. – Enix

+0

Спасибо @Enix. Не могли бы вы дать мне ссылку, чтобы я мог следить за тем, что вы только что объяснили? – MiniGunnR

ответ

4

Просто для справки

Предположим, у вас есть три модели:

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 явно задает поле сериализатора в сериализаторе.

Надеюсь, это поможет.