Как отфильтровать варианты, которые имеют отношения "многие ко многим" с категорией

Вот мой код:

# VIEW.PY
def retrieve(self, request, pk=None):
    variant_id = request.get('variant_id')
    queryset = Category.objects.filter(category_id=pk)
    querysetSerializer = CategoryServiceListSerializer(queryset, many=True)

Я хочу отфильтровать variant_id от Variant, чтобы отображалась только эта конкретная переменная. Не уверен, где нужно внести изменения в представления или serialzier.

Предполагаю, что это может быть решением

queryset = Category.objects.filter(category_id=pk,variant__in = variant_id) 

но получаем ошибку TypeError: 'int' object is not iterable

# MODELS.PY
class Category(models.Model):
    category_id = models.AutoField(primary_key=True)
    category_name = models.CharField(max_length=50)
    category_icon = models.CharField(max_length=500, null=True, blank=True)
    category_image = models.CharField(max_length=500, null=True, blank=True)
    category_description = models.CharField(max_length=1000, null=True, blank=True)
    active_status = models.BooleanField(default=True)
    
    
class Variant(models.Model):
    variant_id = models.AutoField(primary_key=True)
    service_id = models.ManyToManyField(Services)
    category_id = models.ManyToManyField(Category)
    variant_name = models.CharField(max_length=100)
    variant_icon = models.CharField(max_length=1000, null=True, blank=True)
    variant_image = models.CharField(max_length=1000, null=True, blank=True)
    variant_description = models.CharField(max_length=5000, null=True, blank=True)
    active_status = models.BooleanField(default=True)
    
    
# SERIALIZER.PY
class CategoryServiceListSerializer(serializers.ModelSerializer):
    variant = VariantServiceSerializer(many=True, source="variant_set")
    class Meta:
        fields = "__all__"
        model = Category

class VariantServiceSerializer(serializers.ModelSerializer):
    class Meta:
        model = Variant
        fields = "__all__"

вывод:

"data": {
            "category_id": 1,
            "category_name": "Home Cleaning",
            "variant": [
                {
                    "variant_id": 1,
                    "variant_name":
                 },
{
                    "variant_id": 2,
                    "variant_name":
                 },
{
                    "variant_id": 3,
                    "variant_name":
                 },
{
                    "variant_id": 2,
                    "variant_name":
                 }
                 ]
}

Ожидаемый_вывод:

req:

{"variant_id:1}

ответ:

{
                "category_id": 1,
                "category_name": "Home Cleaning",
                "variant": {
                        "variant_id": 1,
                        "variant_name":
                     }
                     

Можно сделать так: variant сделать поле SerializerMethodField, а затем фильтровать по параметрам, переданным в контексте.

По вашему мнению:

def retrieve(self, request, pk=None):
    variant_id = request.get('variant_id')
    queryset = Category.objects.filter(category_id=pk)
    querysetSerializer = CategoryServiceListSerializer(queryset, many=True, context={'variant_id': variant_id})
    [...]

В вашем сериализаторе:

class CategoryServiceListSerializer(serializers.ModelSerializer):
    variant = SerializerMethodField()

    def get_variant(self, instance):
        variant_id = self.context.get('variant_id')
        if variant_id:
            variants = instance.variant_set.filter(pk=variant_id)
        else:
            variants = instance.variant_set.all()
        return VariantServiceSerializer(variants, many=True).data

    class Meta:
        fields = "__all__"
        model = Category
Вернуться на верх