簡體   English   中英

在Django Rest框架中轉儲自定義過濾字段作為響應

[英]Dump A Custom Filtered Field as Response in Django Rest Framework

博客/models.py

class Tag(models.Model):
    label = models.SlugField(null=False, blank=False, unique=True)
    # (iii) or here?

# ...

class Entry(models.Model):
    title = models.CharField(null=False, blank=False, max_length=128)
    content = models.TextField(null=False, blank=False)
    slug = models.SlugField(unique=True)
    tags = models.ManyToManyField(Tag, null=False, blank=False)
    dtime_created = models.DateTimeField(null=False, blank=False, auto_now_add=True)

api / serializers.py

from blog.models import *

from rest_framework import serializers

class EntrySerializer(serializers.ModelSerializer):
    class Meta:
        model = Entry
        fields = ("title", "content")

class TagSerializer(serializers.ModelSerializer):
    class Meta:
        model = Tag
        fields = ("label")
        # (ii) here?

api / views.py

class TagList(APIView):
    def search_by_query(self, query):
        try:
            return Tag.objects.filter(label__icontains=re.escape(query))
            # (i) do something here?
        except Tag.DoesNotExist:
            raise Http404

    def get(self, request, format=None):
        q = None
        try:
            q = request.POST["q"]
        except KeyError:
            return Response(status=status.HTTP_400_BAD_REQUEST)

        tags = self.search_by_query(query)
        serializer = TagSerializer(tags, many=True)
        return Response(serializer.data)

    def post(self, request, format=None):
        if not request.user.is_authenticated():
            return Response(status=status.HTTP_403_FORBIDDEN)

        serializer = TagSerializer(request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

我的問題有點復雜。 現在,我有一個Entry模型使用的Tag模型。 然后,我創建了一個名為TagListAPIView ,該APIView轉儲包含標簽的字符串。 但是,問題是,我還想轉儲標簽在Entry實例中使用了多少次,如下所示:

# This is similiar to how it dumps
[
    {
        "label": "a-label-here"
    },
    {
        "label": "another-label-here"
    }
]

# This is what I want
[
    {
        "label": "a-label-here",
        "length": 5
    },
    {
        "label": "another-label-here",
        "length": 15
    }
]

怎么做?


環境

  • python 3.5.1
  • Django 1.9.5
  • djangorestframework 3.3.3

這很簡單-使用DRF的source core參數。

第1步

Tag模型上定義一種方法,該方法計算任何標簽的出現次數:

class Tag(models.Model):
    label = models.SlugField(null=False, blank=False, unique=True)

    def nr_of_entries(self):
        return self.entry_set.count()

第2步

然后在TagSerializer添加一個自定義字段,該字段將從上面定義的方法中獲取其數據:

class TagSerializer(serializers.ModelSerializer):
    length = serializers.IntegerField(source="nr_of_entries", read_only=True)
    class Meta:
        model = Tag
        fields = ("label", "length")

現在,當tag實例被序列化時,它將包含一個length屬性,該屬性將從在該tag實例上運行nr_of_entries方法的結果獲取其值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM