![](/img/trans.png)
[英]Django Rest Framework : How to add a custom field to the response of the GET request?
[英]Dump A Custom Filtered Field as Response in Django Rest Framework
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)
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?
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
模型。 然后,我創建了一個名為TagList
的APIView
,該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
}
]
怎么做?
這很簡單-使用DRF的source
core參數。
在Tag
模型上定義一種方法,該方法計算任何標簽的出現次數:
class Tag(models.Model):
label = models.SlugField(null=False, blank=False, unique=True)
def nr_of_entries(self):
return self.entry_set.count()
然后在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.