我如何过滤与类别有 many_to_many 关系的变体

how do i filter from variant that is many_to_many relationship with category

这是我的代码:

# 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 中过滤掉 variant_id,以便它只显示特定的变体。不确定需要在视图或 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":
                 }
                 ]
}

Expected_output:

要求:

{"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(variant_id=variant_id)
        else:
            variants = instance.variant_set.all()
        return VariantServiceSerializer(variants, many=True).data

    class Meta:
        fields = "__all__"
        model = Category