Получить значение внешнего ключа в Django-rest Serializer - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь получить значение внешнего ключа, но я только получаю идентификатор, мой код ниже

Model:
    class DocumentType(models.Model):
    """Model for type of documents type system is indexing"""
    title = models.CharField(max_length=255, null=False)

def __str__(self):
    return "{}".format(self.title)


class DocumentsCount(models.Model):
    """Model for type of documents count system is indexing"""
    document_type = models.ForeignKey(DocumentType, on_delete=models.CASCADE, related_name='doc_title')
    count = models.IntegerField(default=0)

    def __str__(self):
        return "{}".format(self.document_type)

Сериализатор

class DocumentCountsSerializer(serializers.ModelSerializer):
title = serializers.ReadOnlyField(source="DocumentType.title")

class Meta:
    model = DocumentsCount
    fields = "__all__"

Нет данных Я получаю от API

    {
    "id": 5,
    "count": 2,
    "document_type": 3
}

document_type должен быть заголовком, но я получаю ID

это запрос

 queryset = DocumentsCount.objects.select_related('document_type')

Я не уверен, что я сделал не так, я на самом делеполучить идентификатор и заголовок, когда вы печатаете queryset и запускаете в sqlite

Ответы [ 3 ]

0 голосов
/ 18 октября 2018

Ответ, отправленный a_k_v, является правильным и вернет вложенный сериализатор в пределах DocumentCountsSerializer().

В качестве альтернативы, если вы хотите получить ответ, подобный следующему:

{ "id": 5, "count": 2, "title": "title here" }

Вам необходимо соответствующим образом обновить ваш сериализатор.Учитывая запрос, который вы выполняете с select_related, ваши сериализаторы будут выглядеть примерно так:

class DocumentCountsSerializer(serializers.ModelSerializer):
    title = serializers.SerializerMethodField()

    class Meta:
        model = DocumentsCount
        fields = "__all__"

     def get_title(self, obj):
         return obj.document_type.title
0 голосов
/ 18 октября 2018

Вы ошиблись при указании источника.Измените его на source="document_type.title", потому что вы хотите сказать «используйте title поля document_type этого экземпляра»:

class DocumentCountsSerializer(serializers.ModelSerializer):
    title = serializers.CharField(source="document_type.title", read_only=True)

    class Meta:
        model = DocumentsCount
        fields = "__all__"

У вас возникла проблема, поскольку поле DocumentType не определенона модели DocumentsCount (поле document_type, которое является внешним ключом для DocumentType).

0 голосов
/ 18 октября 2018

Обновите вашу модель, чтобы она поддерживала вложенный сериализатор, например:

class DocumentTypeSerializer(serializers.ModelSerializer):
       class Meta:
            model = DocumentType
            fields = "__all__"
class DocumentCountsSerializer(serializers.ModelSerializer):
    doc_title = DocumentTypeSerializer(many=True)

    class Meta:
        model = DocumentsCount
        fields = "__all__"

. Вызывая DocumentCountsSerializer для извлечения данных, автоматически выбирайте соответствующие значения внешнего ключа.

Вызывайте сериализатор следующим образом:

queryset = DocumentsCount.objects.all()
serializer = serializers.DocumentTypeSerializer(queryset, many=True)
...