2014-12-22 2 views
1

Я пытаюсь работать с несколькими концепциями моделей стиля аукциона, сейчас у меня есть модель Auction и модель Bid. Эти два относятся через ForeignKey в модели Bid, с Bid.amount, содержащей сумму, которую пользователь выставил.Создание модели аукциона a la eBay max bid style

Я уже использовать порядок на Bid.amount поле, чтобы определить самую высокую цену, но мне было интересно, если есть простой способ определить max_bid и выход для пользователя является то, что выглядит как система «умный торгов», a la eBay.

Так сказать, если применимо следующее

$ bid1 = 9000 # max bid for bid1 object 
$ bid2 = 6000 # max bid for bid2 object 
$ bid3 = 9500 # max bid for bid3 object 
$ starting_price = 5000 # starting price for the auction 

Когда bid1 помещается (что указывает на высокий умный ставка должна идти до 9000) текущая цена аукциона должна оставаться на 5000, так как нет никакой другой ставки на товар.

Когда bid2 находится текущая цена аукциона должна затем увеличить до 6001 (как bid1 еще выше)

Когда bid3 находится текущая цена аукциона должна затем увеличить до 9001 (перебив bid1, и становится текущий покупатель).

Если у кого-то есть идеи по наилучшему способу решения этого вопроса, я бы хотел их услышать.

Edit: мои модели, для справки

class Auction(models.Model): 
    seller = models.ForeignKey(User) 
    item_id = models.CharField(max_length=255, blank=True, null=True) 
    item_name = models.CharField(max_length=255, blank=True, null=True) 
    winner = models.ForeignKey(User, related_name='Auction_Winner', blank=True, null=True) 
    reserve = models.CharField(max_length=255, blank=True, null=True) 
    is_guildbank_sale = models.BooleanField(default=True) 
    created = models.DateTimeField(editable=False, null=True) 
    expires = models.DateTimeField(editable=False, null=True) 

def __unicode__(self): 
    return '%s selling %s' % (self.seller, self.item_name) 

    def save(self, *args, **kwargs): 
     ''' On save, update timestamps ''' 
     if not self.id: 
      self.created = datetime.today() 
     self.expires = datetime.today() + timedelta(days=3) 
     return super(Auction, self).save(*args, **kwargs) 


class Bid(models.Model): 
    auction = models.ForeignKey(Auction, null=True) 
    user = models.ForeignKey(User, related_name='bid_owner', null=True) 
    bid_amount = models.IntegerField(blank=True, null=True) 

    class Meta: 
     verbose_name = "Auction Bid" 
     verbose_name_plural = "Auction Bids" 
     ordering = ['-bid_amount',] 
     get_latest_by = 'bid_amount' 

ответ

1

Я хотел бы создать функцию для вашей модели аукциона и сделать его экземпляр атрибута с @property декоратора. Я бы не сохранил его как значение базы данных, потому что вы столкнетесь с проблемами состояния гонки.

class Auction(models.Model): 
    ... 
    def _get_increment(self): 
     """ add some logic to base incrementing amount on starting price """ 
     ... 

    @property 
    def current_auction_price(self): 
     price = self.starting_amount 
     bid_increment = self._get_increment() 

     """ If there is more than 1 bid present, take the second highest value and add the bid increment. """ 
     if self.bid_set.count() > 1: 
      price = self.bid_set.order_by('bid_amount')[-2].bid_amount + bid_increment 

     return price 

Это позволит вам использовать значение непосредственно в шаблоне.

{{ object.current_auction_price }} 
+0

Спасибо за это, я вижу несколько ошибок, которые вы, возможно, захотите исправить в своем коде. во-первых, вы не можете иметь отрицательный индекс, поэтому для получения второй наивысшей ставки будет [1] не [-2]. во-вторых, нет атрибута для bid_set с именем order, я считаю, что то, что вы искали, было бы .order_by. Увидев, что это уже определено в классе Meta, не нужно ли это просто быть .all()? –

+0

Да, отрицательные индексы действительны. [Ссылка] (www.diveintopython.net/native_data_types/lists.html). Моя ошибка заключалась в сортировке спуска и по-прежнему с конца. Я изменил свой вид на восхождение и зафиксировал имя метода order_by. –

+0

Отлично, это объясняет, почему я получал отрицательные индексные ошибки. Спасибо, что поняли это. :) –

Смежные вопросы