簡體   English   中英

Django REST:ViewSet 自定義詞典

[英]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,
        },
    ...
}

我目前的做法:

  1. 我首先檢索雇主(用戶)的所有目標群體。
  2. 我檢索連接到給定類別 ID 的目標組。
  3. 我在前端以編程方式制作了一個字典,通過循環檢索到的列表......

顯然,這是非常低效的,需要對數據庫進行 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.

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