gpt4 book ai didi

django - 我如何过滤与类别有多对多关系的变体

转载 作者:行者123 更新时间:2023-12-04 17:12:46 24 4
gpt4 key购买 nike

这是我的代码:

# 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 以便它只显示特定的变体。不确定需要在 View 或 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":
}
]
}

预期输出:

要求:

{"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

关于django - 我如何过滤与类别有多对多关系的变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69175132/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com