Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

2.4K
Vistas
django-rest-framwork obtuvo AttributeError al intentar obtener un valor para el campo

Quiero obtener todos los valores de la tabla prodcut con la tabla de clasificación de productos. Hice algo como esto, pero este código me da AttributeError . Así que hice product_ratings = ProductRatingSerializer(many=True) en el serializador de productos y usé este valor en el campo, pero no funciona:

El mensaje de error completo:

 Got AttributeError when attempting to get a value for field `product_ratings` on serializer `ProductSerializer`. The serializer field might be named incorrectly and not match any attribute or key on the `Product` instance. Original exception text was: 'Product' object has no attribute 'product_ratings'.

vista :

 class StoreApiView(mixins.CreateModelMixin, generics.ListAPIView): lookup_field = 'pk' serializer_class = ProductSerializer def get_queryset(self): qs = Product.objects.all() query = self.request.GET.get('q') if query is not None: qs = qs.filter( Q(title__icontains=query) | Q(description__icontains=query) ).distinct() return qs

sus clases de serializador:

 class ProductRatingSerializer(ModelSerializer): class Meta: model = Product_ratings fields = [ 'p_id', 'commenter', 'comment', 'rating', 'created_date', ] read_only_fields = ['p_id'] class ProductSerializer(ModelSerializer): product_ratings = ProductRatingSerializer(many=True) author = serializers.SerializerMethodField() def get_author(self, obj): return obj.author.first_name class Meta: model = Product fields = [ 'product_id', 'author', 'category', 'title', 'description', 'filepath', 'price', 'created_date', 'updated_date', 'product_ratings', ] read_only_fields = ['product_id', 'created_date', 'updated_date', 'author']

clase de modelo relacionado:

 class Product(models.Model): product_id = models.AutoField(primary_key=True) author = models.ForeignKey(User, on_delete=models.CASCADE, db_index=True) category = models.ForeignKey(Category, on_delete=models.CASCADE, to_field='cat_id') title = models.CharField(max_length=120) description = models.TextField(null=True, blank=True) price = models.CharField(max_length=50, null=True, blank=True) filepath = models.CharField(max_length=100, null=True, blank=True) created_date = models.DateTimeField(auto_now_add=True) updated_date = models.DateTimeField(auto_now=True) class Product_ratings(models.Model): p_id = models.ForeignKey(Product, on_delete=models.CASCADE, to_field='product_id') commenter = models.ForeignKey(User, on_delete=models.CASCADE) comment = models.CharField(max_length=200, null=True, blank=True) rating = models.IntegerField(null=True, blank=True) created_date = models.DateTimeField(auto_now_add=True)
over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

El nombre de búsqueda inversa predeterminado para ForeignKey es <mode>_set o product_ratings_set en su caso, por lo que debe reemplazar el campo product_ratings en ProductSerializer con product_ratings_set :

class ProductSerializer(ModelSerializer):
    product_ratings_set = ProductRatingSerializer(many=True)

    class Meta: 
        model = Product
        fields = [ ... 'product_ratings_set' ]

También puede agregar related_name='product_ratings' a la ForeignKey del modelo para cambiar el nombre de búsqueda inversa, en este caso no necesita cambiar demasiado el serializador:

 class Product_ratings(models.Model): p_id = models.ForeignKey(Product, on_delete=models.CASCADE, to_field='product_id', related_name='product_ratings')
over 4 years ago · Santiago Trujillo Denunciar

0

en mi caso, tuve que devolver solo un objeto de mis views.py pero estaba devolviendo queryset , por lo que cambiar objects.filter a objects.get me solucionó el problema

over 4 years ago · Santiago Trujillo Denunciar

0

La respuesta seleccionada no me funciona. Sin embargo, la siguiente manera funcionó:

 product_ratings = ProductRatingSerializer(many=True)

También recuerde poner product_ratings en el campo related_name de esta manera:

 p_id = models.ForeignKey(Product, on_delete=models.CASCADE, to_field='product_id', related_name='product_ratings')

Así es como se ve la clase Meta:

 class Meta: model = Product fields = [ ... 'product_ratings' ]
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda