我如何过滤与类别有 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
这是我的代码:
# 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