Django - добавить онлайн-столбцы в «выберите» - PullRequest
2 голосов
/ 27 ноября 2009

Я не знаю, если это лучший способ решить мою проблему, если нет, скажите мне, плз:)

У меня есть эта модель:


class userTrophy(models.Model):
 user     = models.ForeignKey(userInfo)
 platinum = models.IntegerField()
 gold    = models.IntegerField()
 silver  = models.IntegerField()
 bronze  = models.IntegerField()
 level   = models.IntegerField()
 perc_level  = models.IntegerField()
 date_update = models.DateField(default=datetime.now, blank=True)

Теперь я хочу получить информацию об одном пользователе, но я хочу добавить 3 новых «столбца» онлайн:

всего = платина + золото + серебро + бронза

точка = платина * 100 + золото * 50 + серебро * 25 + бронза * 10

и сортируйте по «точке», после сортировки ставьте новый столбец с порядковым номером: rank (1-n).

Могу ли я сделать это (или часть этого), работая только с моделью?

Ответы [ 3 ]

3 голосов
/ 27 ноября 2009

Вот как я бы это сделал. Добавьте столбцы 'total' и 'points' к вашей модели, например так:

class UserTrophy(models.Model):
    ...
    total = models.IntegerField()
    points = models.IntegerField()
    ...

Переопределить метод сохранения для вашей модели:

def save(self, *args, **kwargs):
    # Compute the total and points before saving
    self.total = self.platinum + self.gold + self.silver + self.bronze
    self.points = self.platinum * 100 + self.gold * 50 + \
        self.silver * 25 + self.bronze * 10

    # Now save the object by calling the super class
    super(UserTrophy, self).save(*args, **kwargs)

Имея общее количество очков и баллов в качестве первоклассных граждан в вашей модели, ваша концепция «ранга» становится просто вопросом упорядочения и нарезки объектов UserTrophy.

top_ten = UserTrophy.objects.order_by('-points')[:10]

Вы также должны убедиться, что ваши поля проиндексированы, чтобы ваши запросы были эффективными.

Если вам не нравится идея размещения этих полей в вашей модели, вы можете использовать функцию extra объектов набора запросов Django для вычисления вашего итогового значения и баллов на лету. Я использую это не очень часто, так что, может быть, кто-то другой может привести пример.

Кроме того, я рекомендую вам прочитать PEP 8 для соглашений Python по кодированию.

3 голосов
/ 27 ноября 2009

Я уверен, что есть много способов добиться такого поведения. Я сейчас думаю о Диспетчере пользовательских моделей и полях переходной модели.

Ваш класс может выглядеть так:

from django.db import models
from datetime import datetime

class UserTrophyManager(models.Manager):
  def get_query_set(self):
    query_set = super(UserTrophyManager, self).get_query_set()

    for ut in query_set:
      ut.total = ut.platinum + ut.gold + ut.silver + ut.bronze
      ut.points = ut.platinum * 100 + ut.gold * 50 + ut.silver * 25 + ut.bronze * 10

    return query_set

class UserTrophy(models.Model):
  user         = models.CharField(max_length=30)
  platinum     = models.IntegerField()
  gold         = models.IntegerField()
  silver       = models.IntegerField()
  bronze       = models.IntegerField()
  level        = models.IntegerField()
  perc_level   = models.IntegerField()
  date_update  = models.DateField(default=datetime.now, blank=True)

  total        = 0
  point        = 0

  objects      = UserTrophyManager()

  class Meta:
    ordering = ['points']

Таким образом, вы можете использовать следующее и получить итоговые и подсчитанные баллы:

user_trophies = userTrophy.objects.all()

for user_trophy in user_trophies:
    print user_trophy.total
1 голос
/ 27 ноября 2009

Это скорее дополнительный вопрос, чем ответ, но возможно ли сделать что-то вроде:

class userTrophy(models.Model):
... stuff...

    def points(self):
        self.gold + self.silver + self.bronze

затем вызовите что-то вроде object.points в шаблоне. Мне просто любопытно, если это возможно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...