es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo referenciar self.something en models.py de Django?

Estoy trabajando en un proyecto de Django que utiliza modelos. Quiero acceder de alguna manera a la oferta más alta en esa lista en todo momento (como lista.mayor_oferta) o de alguna otra manera si hay una solución mejor. Lo que intenté en el fragmento de código siguiente para la mayor oferta no parece funcionar, ya que me devuelve un AttributeError (AttributeError: el objeto ‘str’ no tiene atributo ‘ofertas’). ¿Cómo puedo acceder a los valores de los parámetros propios de un modelo y filtrarlos según mi preferencia?

class Listing(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="listings")
    title = models.CharField(max_length=100)
    description = models.CharField(max_length=1000)
    starting_bid = models.PositiveIntegerField()
    picture = models.TextField(max_length=200, default='static/auctions/notfound.png')
    category = models.ForeignKey(Category, on_delete=models.CASCADE,related_name="listings") 
    is_active = models.BooleanField()
    highest_bid = self.bids.aggregate(Max('price'))

    def __str__(self):
        return f"{self.title}";


class Bid(models.Model):
    listing = models.ForeignKey(Listing, on_delete=models.CASCADE, related_name="bids")
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="bids")
    price = models.PositiveIntegerField()
    # time TODO
    def __str__(self) -> str:
        return f"Bid #{self.id}";
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Puedes acceder a la oferta más alta de la lista usando el método .objects.filter() del modelo Bid. Puedes filtrar las ofertas por el id de la lista y luego usar el método .aggregate() para obtener el precio máximo de las ofertas. El fragmento de código que sigue debería funcionar:

    highest_bid = Bid.objects.filter(listing_id=self.id).aggregate(Max('price'))
    

Comments are closed.