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")
Вернуться на верх