0

Currently I'm implementing the django-rest-framework in my project.
I want a custom response from my serializer (which is a serialized relation) but at the same time I also want to use custom queryset with query params so I implemented get_queryset()method in my generics.ListAPIView. Using this I can't get my custom serialized relations in my response.


Serializer.py

class ChainedSerializer(serializers.ModelSerializer):
    cate = serializers.SerializerMethodField()
    sub_cate = serializers.SerializerMethodField()

    class Meta:
        model = Chained
        exclude = ('id', 'shop')

    def get_cate(self, obj):
        cat = Cate.objects.get(id=obj.cate.id)
        print(cat)
        return cat.cate_name

    def get_sub_cate(self, obj):
        sub_cats = SubCate.objects.get(id=obj.sub_cate_id).sub_cate_name
        return sub_cats


class ShopSerializer(serializers.ModelSerializer):
    shop = ChainedSerializer(read_only=True, many=True)

    class Meta:
        model = Shop
        fields = '__all__'


Views.py

class ShopList(generics.ListAPIView):
    queryset = Shop.objects.all()
    serializer_class = ShopSerializer
    permission_classes = (permissions.AllowAny,)

    def get_queryset(self):
        subcate = self.request.query_params.getlist('subcate')

        subcate_ids = list(
            SubCate.objects.filter(sub_cate_name__in=subcate).values_list('id', flat=True))

        shop_ids = list(Chained.objects.filter(sub_cate_id__in=subcate_ids).values_list(
            'shop_id', flat=True))

        queryset = Shop.objects.filter(id__in=shop_ids).values()

        return queryset

Response when using the ```get_queryset()``` method
[ {
        "id": 1,
        "shop_type": "willodale",
        "shop_name": "first shop",
        "shop_email": "something@gmail.com",
        "phone": "1111111111",
        "area_code": "11111",
        "area_name": "dummy",
        "shop_address": "dummy",
    }
]

Response if I don't use the get_queryset() method:

[
    {
        "id": 2,
        "shop": [
            {
                "cate": "Serv",
                "sub_cate": "WI"
            }
        ],
        "shop_type": "type",
        "shop_name": "dummy2",
        "shop_email": "something2@gmail.com",
        "phone": "1111111111",
        "area_code": "11111",
        "area_name": "dummy",
        "shop_address": "dummy",
    },
    {
        "id": 1,
        "shop": [
            {
                "cate": "Serv",
                "sub_cate": "Park"
            },
            {
                "cate": "Amb",
                "sub_cate": "Rom"
            },
            {
                "cate": "Serv",
                "sub_cate": "WI"
            }
        ],
        "shop_type": "type2",
        "shop_name": "dummy",
        "shop_email": "something@gmail.com",
        "phone": "1111111111",
        "area_code": "11111",
        "area_name": "dummy",
        "shop_address": "dummy",
    }
]

Also attached is my models.py

class Shop(models.Model):
    shop_type = models.CharField(choices=SHOP_TYPE, default='type', max_length=255)
    shop_name = models.CharField(max_length=255)
    shop_email = models.EmailField()
    phone = models.CharField(max_length=10)
    area_code = models.CharField(max_length=255)
    area_name = models.CharField(max_length=255)
    shop_address = models.TextField()

    def __str__(self):
        return self.shop_name


class Cate(models.Model):
    cate_name = models.CharField(max_length=255)

    def __str__(self):
        return self.cate_name


class SubCate(models.Model):
    cate = models.ForeignKey(Cate, on_delete=models.CASCADE)
    sub_cate_name = models.CharField(max_length=255)

    def __str__(self):
        return self.sub_cate_name


class Chained(models.Model):
    shop = models.ForeignKey(Shop, on_delete=models.CASCADE, related_name='shop')
    cate = models.ForeignKey(Cate, on_delete=models.CASCADE, related_name='cate_chained')
    sub_cate = ChainedForeignKey(
        SubCate,
        chained_field="cate",
        chained_model_field="cate",
        sort=True)

Can I use get_queryset filters along with my custom serialized response together or is there any other way to achieve this so that I can get my serialized response along with filters

Brian Tompsett - 汤莱恩
  • 5,753
  • 72
  • 57
  • 129

0 Answers0