Django Rest Framework пытается получить похожие продукты с обращенным сериализатором
я новичок в DRF и пытаюсь сериализовать похожий продукт на продукт. вот мой код
models.py
class Product(models.Model):
headline = models.CharField(max_length=150)
category = models.ManyToManyField(Category, related_name="products")
tag = models.TextField(null=True, blank=True)
sku = models.CharField(max_length=50, unique=True)
sell_limit = models.IntegerField(default=10)
price = models.FloatField(default=0)
class SimilarProduct(models.Model):
on_product = models.ForeignKey(Product, on_delete=models.SET_NULL, blank=True, null=True, related_name="on_products")
product = models.ForeignKey(Product, on_delete=models.SET_NULL, blank=True, null=True, related_name="products")
serializers.py
class ProductDetailSerializer(serializers.ModelSerializer):
category = serializers.SerializerMethodField()
similar = serializers.SerializerMethodField()
В сериализаторах я написал такой код, который не работает. #CODE :
def get_similar(self, obj):
product_query = Product.objects.filter(pk__in=obj.on_products.values_list("id"))
return ProductListSerializer(product_query, many=True).data
и вот мой ProductListSerializer
class ProductListSerializer(serializers.ModelSerializer):
category = serializers.SerializerMethodField()
price = serializers.SerializerMethodField()
я хочу получить похожие продукты продукта, но это не работает. есть идеи как решить?
Вместо SerializerMethodField
вы можете напрямую использовать SimilarProductSerializer
с many=True
:
class SimilarProductSerializer(serializers.ModelSerializer):
category = serializers.SerializerMethodField()
price = serializers.SerializerMethodField()
class Meta:
model = SimilarProduct
fields = ['category', 'price']
class ProductDetailSerializer(serializers.ModelSerializer):
category = serializers.SerializerMethodField()
products = SimilarProductSerializer(many=True)
class Meta:
model = Product
fields = ['category', 'products']
Я думаю, вы также можете изменить связанное имя поля продукта модели SimilarProduct
, это будет более понятно, и вы сможете получить доступ к similiar_products
объекта Product
по product.similar_products
.
class SimilarProduct(models.Model):
on_product = models.ForeignKey(Product, on_delete=models.SET_NULL, blank=True, null=True, related_name="on_products")
product = models.ForeignKey(Product, on_delete=models.SET_NULL, blank=True, null=True, related_name="smilar_products")