Как ссылаться на self.something как на ForeignKey в Django models.py?

Я работаю над проектом Django, который использует модели. Я хочу каким-то образом получить доступ к самой высокой ставке по данному объявлению в любое время (как listing.highest_bid) или каким-то другим способом, если есть лучшее решение. То, что я попробовал в приведенном ниже фрагменте кода для highest_bid, похоже, не работает, это дает мне AttributeError (AttributeError: 'str' object has no attribute 'bids'). Как я могу получить доступ к значениям параметров модели и отфильтровать их по своему усмотрению?

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 = models.ForeignKey("self".bids.aggregate(Max('price')).first()) #["price__max"]
        # highest bid
        # listing created on xxxx-xx-xx
        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}"

Вы можете просто использовать @property, чтобы вернуть такое вычисляемое поле

class Listing(models.Model):
   # Some fields
   
   @property
   def highest_bid(self):
       # Access the Listing bids by reverse foreign key and retrieve the first with highest price
       return self.bids.order_by('-price').first()

Примечание : Каждый раз, когда вы делаете listing.highest_bid функция будет выполняться, чтобы вернуть результат (Dynamic)

Вернуться на верх