[英]Django REST: ViewSet custom dictionary
我的目標是檢索一個字典,其中鍵是目標組 object 的 id,值是對應的目標組 object。
此外,我想要一個自定義字段“啟用”,它表示 target_group 是否與給定類別(cat_id)配對。
url 例如:
http://localhost:8000/api/ctg/?cat_id=61
結果字典示例:
{
1: {
id: 1,
name: "target group name",
employer: 175,
enabled: false,
},
5: {
id: 5,
name: "another target group name",
employer: 175,
enabled: true,
},
...
}
我目前的做法:
顯然,這是非常低效的,需要對數據庫進行 2 次調用。
如果可能的話,我想檢索可以在前端立即使用的字典。 我一直在尋找解決方案,但除了基礎知識之外,我真的找不到太多關於 DRF 的信息……有人能指出我如何實現這一目標的正確方向嗎?
視圖集:
# get all target groups
class TargetGroupViewset(viewsets.ModelViewSet):
queryset = TargetGroup.objects.all()
serializer_class = TargetGroupSerializer
def list(self, request):
queryset = TargetGroup.objects.filter(employer=self.request.user.pk)
serializer = TargetGroupSerializer(queryset, many=True)
return Response(serializer.data)
# get target groups which are connected to a given category
class GetTargetGroupsForCategory(viewsets.ModelViewSet):
queryset = TargetGroup.objects.all()
serializer_class = TargetGroupSerializer
def list(self, request):
queryset = TargetGroup.objects.filter(employer=self.request.user.pk)
if request.query_params:
cat_id = request.query_params['cat_id']
ctg_ids = list(CategoryTargetGroup.objects.filter(category=cat_id).values_list('target_group_id', flat=True))
queryset = TargetGroup.objects.filter(id__in=ctg_ids)
serializer = TargetGroupSerializer(queryset, many=True)
return Response(serializer.data)
楷模
# target group model
class TargetGroup(models.Model):
employer = models.ForeignKey(CustomUser, on_delete=models.CASCADE, null=False)
name = models.CharField(max_length=255, blank=False, null=False)
# category-targetgroup model
class CategoryTargetGroup(models.Model):
category = models.ForeignKey(Category, on_delete=models.CASCADE, null=False)
target_group = models.ForeignKey(TargetGroup, on_delete=models.CASCADE, null=False)
當前,您的TargetGroupSerializer
返回此:
[
{
id: 1,
name: "target group name",
employer: 175,
enabled: false,
},
{
id: 5,
name: "another target group name",
employer: 175,
enabled: true,
},
...
]
為了將其轉換為所需的結果,您可以使用 dict 理解,如下所示:
def list(self, request):
...
result = {item['id']: item for item in serializer.data}
return Response(result)
至於問題的第二部分,我認為您不需要GetTargetGroupsForCategory
視圖集。 要添加enabled
字段,您可以在TargetGroupSerializer
中聲明SerializerMethodField :
class TargetGroupSerializer(serializers.ModelSerializer):
# your serializer fields + new `enabled` field
enabled = serializers.SerializerMethodField()
class Meta:
# your options
def get_enabled(self, obj):
return self.context['cat_id'] == obj.id
最后將cat_id
傳遞給TargetGroupViewset
中的序列化程序上下文:
def list(self, request):
queryset = TargetGroup.objects.filter(employer=self.request.user.pk)
cat_id = request.query_params.get('cat_id', None)
serializer = TargetGroupSerializer(queryset, many=True, context={'cat_id': cat_id})
result = {item['id']: item for item in serializer.data}
return Response(result)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.